Absturz Symcon

Hallo paresy,

leider noch ein Problem seit dem Update von heute morgen bei mir.

Mit dem neuen Update läuft Symcon etwa 2 - 3 Minuten und dann ist der Server nicht mehr erreichbar.

Beim Neustart von Symcon wird mir dann gesagt, das Symcon nicht läuft.


sudo /etc/init.d/symcon restart
IP-Symcon is not running
IP-Symcon started with PID 16662
pi@IP-Symcon ~ $ 

Leider kenne ich noch keinen Grund, aber es scheint etwas mit KNX oder Chromoflex zutun zu haben.

Grüße

Oli

Hallo paresy,

dieses Script führt zum Absturz von Symcon.

<?

//ID der I/O Instanz vom Chromoflex RC III.
//Konfiguration: 115200, 8, 1, N
$id = 32594 /*[Chromoflex COM]*/; //I/O Instanz


/*******************************************************************************

 Copyright 2012, IP-Symcon/meike0_0. Version 1.2.0 - DO NOT MODIFY BELOW THIS LINE!

********************************************************************************/

if($_IPS['SENDER'] == "RunScript")
{
    if(isset($_IPS['Action']))
    {
       switch($_IPS['Action'])
        {
           case "Initialize":
              Initialize();
                break;
            case "SetColor":
                if(!isset($_IPS['Net']))
                    $_IPS['Net'] = 8;
                if(!isset($_IPS['DeviceID']))
                    $_IPS['DeviceID'] = "000000";
                if(!isset($_IPS['R']))
                    $_IPS['R'] = 0xFF;
                if(!isset($_IPS['G']))
                    $_IPS['G'] = 0xFF;
                if(!isset($_IPS['B']))
                    $_IPS['B'] = 0xFF;
                if(!isset($_IPS['D']))
                    $_IPS['D'] = 0xFF;

                if(IPS_SemaphoreEnter($_IPS['SELF'],5000)){}else
                {
                    $x = "";
                    $x .= chr($_IPS['Net']); //Network
                    $x .= HexToStr($_IPS['DeviceID']); //Remote Serial
                    $x .= chr(GetSequenceNumber());
                    $x .= chr(0xFF).chr(0xFF).chr(0xFE); //PC Serial

                    $x .= chr(0x80); //Command: Write
                    $x .= chr(0x01); //RAM Adress (???)
                    $x .= chr(0x12); //ProgramPC (???)

                    $x .= chr(max(1, $_IPS['D'])); //Dimmer (0 = ON, 1 = 0%, 255 = 100%)
                    $x .= chr(0x00); //Index (???)
                    $x .= chr(0x01); //Dummy (???)
                    $x .= chr(0xFF); //Temp (???)

                    $x .= chr($_IPS['R']); //Red
                    $x .= chr($_IPS['G']); //Green
                    $x .= chr($_IPS['B']); //Blue

                    SPRT_SendText($id, CreatePacket($x));
                    IPS_Sleep(100);
                    IPS_SemaphoreLeave($_IPS['SELF']);
                }
               break;
            case "SetProgram":
                if(!isset($_IPS['Net']))
                    $_IPS['Net'] = 8;
                if(!isset($_IPS['DeviceID']))
                    $_IPS['DeviceID'] = "000000";
                if(!isset($_IPS['P']))
                    $_IPS['P'] = 0;
                    
                    
          	 //   if(!isset($_IPS['D']))
             //       $_IPS['D'] = 0xFF;
                    
                    
                if(IPS_SemaphoreEnter($_IPS['SELF'],5000)){}else
                {
                    switch ($_IPS['P'])
                    {
                        case 0: //Aus
                        case 1: //Speichern&Aus
                        case 2: //Fix Color
                        case 3: //Color Change
                        case 4: //Med.Color
                        case 5: //Slow.Color
                        case 6: //Blob
                        case 7: //LSD
                        case 8: //Fire
                        case 9: //Flashes
                        case 10: //Bursts
                        case 11: //User 1
                        case 12: //User 2
                        case 13: //User 3
                        case 14: //Slow Strobo
                        case 15: //Strobo
                        case 16: //Fast Strobo
                        case 17: //Mix
                        case 18: //Color
                            $x = "";
                            $x .= chr($_IPS['Net']); //Network
                            $x .= HexToStr($_IPS['DeviceID']); //Remote Serial

                            $x .= chr(GetSequenceNumber());
									 $x .= chr(0xFF).chr(0xFF).chr(0xFE); //PC Serial

								//	 $x .= chr(max(1, $_IPS['D'])); //Dimmer (0 = ON, 1 = 0%, 255 = 100%)

									 $x .= chr(0x80); //Index (???)
                            $x .= chr(0x01); //Dummy (???)
                            $x .= chr($_IPS['P']); //Temp (???)
                            $x .= chr(0x00); //Temp (???)
                            break;
                    }

                    SPRT_SendText($id, CreatePacket($x));
                    IPS_Sleep(100);
                    IPS_SemaphoreLeave($_IPS['SELF']);
                }
                break;
        }
    }
}
if($_IPS['SENDER'] == "Execute")
{
    Initialize();
    IPS_Sleep(200);
    IPS_RunScriptEx($_IPS['SELF'], Array("Action"=>"SetColor", "R"=> rand(0, 255), "G" => rand(0, 255), "B" => rand(0, 255)));
}

function Initialize()
{
    global $id;
 	SPRT_SetDTR($id, true);
 	SPRT_SetRTS($id, true);

   SPRT_SendText($id, "!n0701\r");
}

function GetSequenceNumber()
{
    //32-47 Sequence Number (0..15 + 32)
    $seq_id = 25812 /*[Objekt #25812 existiert nicht]*/;//CreateVariableByIdent($_IPS['SELF'], "SequenceNumber", "Sequence Number", 1);
    $seq = GetValue($seq_id);
    $seq = ($seq+1) % 16;
    SetValue($seq_id, $seq);
    return $seq + 32;
}

function CreateVariableByIdent($id, $ident, $name, $type)
 {
     $vid = @IPS_GetObjectIDByIdent($ident, $id);
     if($vid === false)
     {
         $vid = IPS_CreateVariable($type);
         IPS_SetParent($vid, $id);
         IPS_SetName($vid, $name);
         IPS_SetIdent($vid, $ident);
         IPS_SetInfo($vid, "this variable was created by script #".$_IPS['SELF']);
     }
     return $vid;
}

function CreatePacket($data)
{
    return "!x0000".StrToHex(Chr(strlen($data)+2)).StrToHex($data).StrToHex(MakeCRC($data))."\r\r";
}

function MakeCRC($data)
{
    // Fast generation of CRC by using a table...
    $CRC_TABLE_A = Array(
         0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0,
         0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41,
         0x00, 0xC1, 0x81, 0x40, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0,
         0x80, 0x41, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40,
         0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1,
         0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0, 0x80, 0x41,
         0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1,
         0x81, 0x40, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41,
         0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0,
         0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x00, 0xC1, 0x81, 0x40,
         0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1,
         0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40,
         0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0,
         0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x00, 0xC1, 0x81, 0x40,
         0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0,
         0x80, 0x41, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40,
         0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0,
         0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41,
         0x00, 0xC1, 0x81, 0x40, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0,
         0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41,
         0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0,
         0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x00, 0xC1, 0x81, 0x40,
         0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1,
         0x81, 0x40, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41,
         0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0,
         0x80, 0x41, 0x00, 0xC1, 0x81, 0x40
    );

    $CRC_TABLE_B = Array(
         0x00, 0xC0, 0xC1, 0x01, 0xC3, 0x03, 0x02, 0xC2, 0xC6, 0x06,
         0x07, 0xC7, 0x05, 0xC5, 0xC4, 0x04, 0xCC, 0x0C, 0x0D, 0xCD,
         0x0F, 0xCF, 0xCE, 0x0E, 0x0A, 0xCA, 0xCB, 0x0B, 0xC9, 0x09,
         0x08, 0xC8, 0xD8, 0x18, 0x19, 0xD9, 0x1B, 0xDB, 0xDA, 0x1A,
         0x1E, 0xDE, 0xDF, 0x1F, 0xDD, 0x1D, 0x1C, 0xDC, 0x14, 0xD4,
         0xD5, 0x15, 0xD7, 0x17, 0x16, 0xD6, 0xD2, 0x12, 0x13, 0xD3,
         0x11, 0xD1, 0xD0, 0x10, 0xF0, 0x30, 0x31, 0xF1, 0x33, 0xF3,
         0xF2, 0x32, 0x36, 0xF6, 0xF7, 0x37, 0xF5, 0x35, 0x34, 0xF4,
         0x3C, 0xFC, 0xFD, 0x3D, 0xFF, 0x3F, 0x3E, 0xFE, 0xFA, 0x3A,
         0x3B, 0xFB, 0x39, 0xF9, 0xF8, 0x38, 0x28, 0xE8, 0xE9, 0x29,
         0xEB, 0x2B, 0x2A, 0xEA, 0xEE, 0x2E, 0x2F, 0xEF, 0x2D, 0xED,
         0xEC, 0x2C, 0xE4, 0x24, 0x25, 0xE5, 0x27, 0xE7, 0xE6, 0x26,
         0x22, 0xE2, 0xE3, 0x23, 0xE1, 0x21, 0x20, 0xE0, 0xA0, 0x60,
         0x61, 0xA1, 0x63, 0xA3, 0xA2, 0x62, 0x66, 0xA6, 0xA7, 0x67,
         0xA5, 0x65, 0x64, 0xA4, 0x6C, 0xAC, 0xAD, 0x6D, 0xAF, 0x6F,
         0x6E, 0xAE, 0xAA, 0x6A, 0x6B, 0xAB, 0x69, 0xA9, 0xA8, 0x68,
         0x78, 0xB8, 0xB9, 0x79, 0xBB, 0x7B, 0x7A, 0xBA, 0xBE, 0x7E,
         0x7F, 0xBF, 0x7D, 0xBD, 0xBC, 0x7C, 0xB4, 0x74, 0x75, 0xB5,
         0x77, 0xB7, 0xB6, 0x76, 0x72, 0xB2, 0xB3, 0x73, 0xB1, 0x71,
         0x70, 0xB0, 0x50, 0x90, 0x91, 0x51, 0x93, 0x53, 0x52, 0x92,
         0x96, 0x56, 0x57, 0x97, 0x55, 0x95, 0x94, 0x54, 0x9C, 0x5C,
         0x5D, 0x9D, 0x5F, 0x9F, 0x9E, 0x5E, 0x5A, 0x9A, 0x9B, 0x5B,
         0x99, 0x59, 0x58, 0x98, 0x88, 0x48, 0x49, 0x89, 0x4B, 0x8B,
         0x8A, 0x4A, 0x4E, 0x8E, 0x8F, 0x4F, 0x8D, 0x4D, 0x4C, 0x8C,
         0x44, 0x84, 0x85, 0x45, 0x87, 0x47, 0x46, 0x86, 0x82, 0x42,
         0x43, 0x83, 0x41, 0x81, 0x80, 0x40
    );

    $CRC_A = 0xFF;
    $CRC_B = 0xFF;

    for($i=0; $i<strlen($data); $i++)
    {
       $INDEX = $CRC_A ^ Ord($data{$i});
       $CRC_A = $CRC_TABLE_A[$INDEX] ^ $CRC_B;
       $CRC_B = $CRC_TABLE_B[$INDEX];
    }
    return Chr($CRC_B) . Chr($CRC_A);
}

//Copy&Paste from php.net (http://php.net/manual/de/function.hexdec.php)
function StrToHex($x) {
    $s = '';
    $p = str_split($x);
    foreach($p as $c)
        $s .= strtolower(sprintf("%02X",ord($c)));
    return($s);
}

function HexToStr($x) {
    $s = '';
    $p = explode("
",trim(chunk_split($x,2)));
    foreach($p as $h)
        $s .= chr(hexdec($h));
    return($s);
}

?>

Hilft das evtl. weiter?

Grüße

Oli

Ja, ich denke es gibt noch einen Fehler bei den Semaphoren. Ich habe da zumindest einen Verdacht!

Danke für deine Suche und den Hinweis.

paresy

Komisch, ich habe heute sehr viel mit den gemacht und gar kein Fehler…

Außer das ich sie durch einen Fehler nicht freigegeben hatte. Was dann auch schön im Log stand :slight_smile:

Allerdings ist es zum einen ein Modul und ich habe ein String und keine ObjektID übergeben.

Michael

Hallo zusammen,

hier der Log

14.07.2015 23:00:14*| ScriptEngine*| Semaphore 58884 for ScriptID 58884 was not released

Grüße

Oli

Wenn ich das auf dem Tablet hier richtig sehe, ist das im Script falsch umgesetzt.

Im true Zweig von SemaphoreEnter ist nie ein Leave. Nur im false. Das ist genau falsch gedacht.

Michael

Moin!

Eigentlich sollten Semaphoren z.B. so aussehen:

<?

if(IPS_SemaphoreEnter("NameDerSemaphore",5000)) {  // 5 Sekunden warten, falls Semaphore belegt, wenn nicht möglich, dann ins ELSE
	// Befehle innerhalb der Semaphore ausführen
   IPS_SemaphoreLeave("NameDerSemaphore");  // Semaphore wieder verlassen
}
else {
	// Semaphore konnte nicht "betreten" werden
}

?>

Prüfen, ob Semaphore frei ist (5 Sekunden darauf warten), wenn frei, dann Befehle in Semaphore ausführen, wenn nicht frei, dann ELSE.

So klappt das, zumindest bei mir unter Windows, sehr gut. Arbeite viel damit.

Grüße,
Chris

Der Fehler, daß Semaphoren gesetzt blieben, wenn das PHP-Skript abgebrochen wurde, scheint raus zu sein:

Provokation:

<?
// Abbruch_PHP.ips.php
$Semap = 'Test';

if (IPS_SemaphoreEnter ($Semap, 1000)) {
    print("
Ablauf: $Semap gesetzt");

    print("
Ablauf: provoziere Fehler");
	 $Temp = FunctionDiesNichtgibt();
    print("
Fehler: PHP muß abgebrochen sein");
}
?>

Ablauf: Test gesetzt
Ablauf: provoziere Fehler
Fatal error:  Call to undefined function FunctionDiesNichtgibt() in /usr/share/symcon/scripts/Abbruch_PHP.ips.php on line 9

Test:

<?
// Test_Semaphoren.ips.php
$Semap = 'Test';

if (IPS_SemaphoreEnter ($Semap, 1000)) {
    print("
Ablauf: $Semap gesetzt");
    if (IPS_SemaphoreEnter ($Semap, 10)) {
        print("
Fehler: $Semap doppelt gesetzt");
    } else {
        print("
Ablauf: $Semap abgewiesen, weil bereits gesetzt");
    }  // Ende Semaphore-Kreis2
    IPS_SemaphoreLeave ($Semap);       // und freigeben
    print("
Ablauf: $Semap zurückgesetzt");

    if (IPS_SemaphoreEnter ($Semap, 10)) {
        print("
Ablauf: $Semap wiederholt gesetzt");
    } else {
        print("
Ablauf: $Semap abgewiesen, weil bereits zum 2ten mal gesetzt");
    }  // Ende Semaphore-Kreis2
    IPS_SemaphoreLeave ($Semap);       // und freigeben
    print("
Ablauf: $Semap wieder zurückgesetzt");
} else {
    print("
Fehler: $Semap fremdgesetzt");
}  // Ende Semaphore-Kreis1

?>


Ablauf: Test gesetzt
Ablauf: Test abgewiesen, weil bereits gesetzt
Ablauf: Test zurückgesetzt
Ablauf: Test wiederholt gesetzt
Ablauf: Test wieder zurückgesetzt

Vielen Dank!
Harald

War etwas voreilig glücklich :mad:

Hab mein obiges Test-Skript einige male mit einem Semaphor getestet, das von einem im Wirkbetrieb laufenden Skript in einer Schleife für ca. 4 Sekunden gesetzt wird und dann für sehr kurze Zeit resettet ist, es kam auch immer


Fehler: BluHci fremdgesetzt

aber beim 3tten oder 4ten Mal beendete sich Symcon.

Im Log ist m.E. nichts festzustellen:

11:30:07 | 31533 | DEBUG   | ScriptEngine         | Executing ScriptID: Skripte\Test-Scripts\Test Semaphoren ~ Sender: Execute
11:30:13 | 35948 | MESSAGE | VariableManager      | [Präsenz\Anwesenheiten\Anwesenheits-Liste] = a:4:{s:2:"LE";a:24:{s:5:"ObjID";s:7:"RaspiB3";s:5:"ObjNa";s$
11:30:13 | 31533 | DEBUG   | ScriptEngine         | Executing ScriptID: Skripte\Test-Scripts\Test Semaphoren ~ Sender: Execute
11:30:19 | 31533 | DEBUG   | ScriptEngine         | Executing ScriptID: Skripte\Test-Scripts\Test Semaphoren ~ Sender: Execute
11:30:20 | 35948 | MESSAGE | VariableManager      | [Präsenz\Anwesenheiten\Anwesenheits-Liste] = a:4:{s:2:"LE";a:24:{s:5:"ObjID";s:7:"RaspiB3";s:5:"ObjNa";s$
11:30:20 | 52624 | DEBUG   | ScriptEngine         | Executing ScriptID: Präsenz\BlE-Scanner ~ Sender: RunScript
11:30:25 | 31533 | DEBUG   | ScriptEngine         | Executing ScriptID: Skripte\Test-Scripts\Test Semaphoren ~ Sender: Execute
11:30:27 | 35948 | MESSAGE | VariableManager      | [Präsenz\Anwesenheiten\Anwesenheits-Liste] = a:4:{s:2:"LE";a:24:{s:5:"ObjID";s:7:"RaspiB3";s:5:"ObjNa";s$
11:30:34 | 35948 | MESSAGE | VariableManager      | [Präsenz\Anwesenheiten\Anwesenheits-Liste] = a:4:{s:2:"LE";a:24:{s:5:"ObjID";s:7:"RaspiB3";s:5:"ObjNa";s$
11:30:41 | 35948 | MESSAGE | VariableManager      | [Präsenz\Anwesenheiten\Anwesenheits-Liste] = a:4:{s:2:"LE";a:24:{s:5:"ObjID";s:7:"RaspiB3";s:5:"ObjNa";s$
11:30:49 | 35948 | MESSAGE | VariableManager      | [Präsenz\Anwesenheiten\Anwesenheits-Liste] = a:4:{s:2:"LE";a:24:{s:5:"ObjID";s:7:"RaspiB3";s:5:"ObjNa";s$
11:30:56 | 35948 | MESSAGE | VariableManager      | [Präsenz\Anwesenheiten\Anwesenheits-Liste] = a:4:{s:2:"LE";a:24:{s:5:"ObjID";s:7:"RaspiB3";s:5:"ObjNa";s$
11:31:03 | 35948 | MESSAGE | VariableManager      | [Präsenz\Anwesenheiten\Anwesenheits-Liste] = a:4:{s:2:"LE";a:24:{s:5:"ObjID";s:7:"RaspiB3";s:5:"ObjNa";s$
11:31:10 | 35948 | MESSAGE | VariableManager      | [Präsenz\Anwesenheiten\Anwesenheits-Liste] = a:4:{s:2:"LE";a:24:{s:5:"ObjID";s:7:"RaspiB3";s:5:"ObjNa";s$
11:31:17 | 35948 | MESSAGE | VariableManager      | [Präsenz\Anwesenheiten\Anwesenheits-Liste] = a:4:{s:2:"LE";a:24:{s:5:"ObjID";s:7:"RaspiB3";s:5:"ObjNa";s$
11:31:24 | 35948 | MESSAGE | VariableManager      | [Präsenz\Anwesenheiten\Anwesenheits-Liste] = a:4:{s:2:"LE";a:24:{s:5:"ObjID";s:7:"RaspiB3";s:5:"ObjNa";s$
11:31:24 | 52624 | DEBUG   | ScriptEngine         | Executing ScriptID: Präsenz\BlE-Scanner ~ Sender: RunScript


Viele Grüsse
Harald

In deinem Test-Script ist auch wieder ein Fehler. Du hast > Semaphore wird betreten, dann IF und dann ELSE und erst danach das LEAVE…

Richtig wäre >> Schau dir mein Beispiel nochmal an, dann IN RUHE dein Script bearbeiten und dann klappts auch :wink:

Grüße,
Chris

Ach, das hat IPS so erschreckt, daß es abstürzte :confused:

Das Thema waren doch IPS-Abstürze und die Vermutung, daß „es noch einen Fehler bei den Semaphoren gibt“ und kein PHP-Kontest. Paresy hat „da zumindest einen Verdacht!“.

Ich wage mal folgende Behauptung: „Wie fehlerhaft ein PHP-Skript auch ist und ob es Fehler oder keine Fehler produziert, es darf niemals zum Absturz von IPS führen!“
Ansonsten ist es keine „stable version“ !

Bilderrätsel: In welcher Zeile steckt der Fehler ?


01 <?
02 // Test_Semaphoren.ips.php
03 $Semap = 'BluHci';
04 
05 if (IPS_SemaphoreEnter ($Semap, 1000)) {
06     print("
Ablauf: $Semap gesetzt");
07     if (IPS_SemaphoreEnter ($Semap, 10)) {
08         print("
Fehler: $Semap doppelt gesetzt");
09     } else {
10         print("
Ablauf: $Semap abgewiesen, weil bereits gesetzt");
11     }  // Ende Semaphore-Kreis2
12     IPS_SemaphoreLeave ($Semap);       // und freigeben
13     print("
Ablauf: $Semap zurückgesetzt");
14 
15     if (IPS_SemaphoreEnter ($Semap, 10)) {
16         print("
Ablauf: $Semap wiederholt gesetzt");
17     } else {
18         print("
Ablauf: $Semap abgewiesen, weil bereits zum 2ten mal gesetzt");
19     }  // Ende Semaphore-Kreis2
20     IPS_SemaphoreLeave ($Semap);       // und freigeben
21     print("
Ablauf: $Semap wieder zurückgesetzt");
22 } else {
23     print("
Fehler: $Semap fremdgesetzt");
24 }  // Ende Semaphore-Kreis1
25 
26 ?>

Viele Grüsse
Harald

Also ich hatte den Fehler mit der Meldung „Semaphore! konnte nicht gesetzt werden“ oder ähnlich. Der ist aber weg.
Und ja ich stimme dem auch zu dass ein fehlerhaftes Script nicht IPS zum Absturz bringen sollte.
Aber wenn man schon ein Script mit Semaphoren schreibt, dann sollte man das Leave auch nur aufrufen wenn die Semaphore erfolgreich gesetzt wurde. Nicht pauschal immer.
Michael

02 // Test_Semaphoren.ips.php

Das Thema ist durch, wenn der Fehler in IPS beseitigt ist

„Programmier-Hygiene“ ist ein anderes Thema

Viele Grüsse
Harald

Ruhig Blut :slight_smile: Entschuldige, dass ich helfen will, mein Fehler :smiley:

Klar darf IPS nicht crashen bei einem fehlerhaften Script…aber ich kann den IPS-Crash nicht beheben…

Dann weiterhin viel Erfolg mit deinem Projekt.

Edit: Ich für meinen Teil habe sehr viel hier im Forum dazu gelernt, durch z.B. solche gut gemeinte Tipps und Verbesserungen, und habe diese immer dankbar angenommen.

MfG,
Chris, der auch noch nicht so lange mit PHP arbeitet, aber trotzdem gerne hilft, ohne dabei sein Ding rausholen zu wollen :rolleyes:

Hi Chris,

ich weiss deine und jede andere Hilfe zu schätzen :wink:

Grüße

Oli

Die letzten Log-Zeilen vor dem Absturz:

14:09:21 | 53646 | DEBUG   | ScriptEngine         | Executing ScriptID: FritzBox Socket\FBF Buf\FBF ~ Sender: RegisterVariable
14:09:21 | 59679 | MESSAGE | VariableManager      | [FritzBox Socket\FBF Buf\Verbindungen] = a:3:{s:3:"Akt";a:1:{i:1;a:9:{s:5:"ZTrig";i:1437048560;s:3:"cID";$
14:09:21 | 55170 | DEBUG   | ScriptEngine         | Executing ScriptID: Telefon\Anruferliste\AnrufMonitor ~ Sender: RunScript
14:09:21 | 26176 | MESSAGE | VariableManager      | [Telefon\Anruferliste] = <table width='99%' align='center' border='0'><tr><td><b>14:09</b></td><td><b>MSN$
14:09:22 | 00000 | WARNING | ScriptEngine         | Result für ScriptID #55170: <br />
<b>Warning</b>:  Cannot find semaphore! in <b>/usr/share/symcon/scripts/AnrufMonitor.ips.php</b> on line <b>33</b><br />
<br />
<b>Notice</b>:  Undefined variable: IPS_SENDER in <b>/usr/share/symcon/scripts/AnrufMonitor.ips.php</b> on line <b>83</b><br />

14:09:25 | 40276 | MESSAGE | VariableManager      | [Präsenz\Anwesenheiten\Anwesenheits-Liste] = a:4:{s:2:"LE";a:24:{s:5:"ObjID";s:6:"PiA2:0";s:5:"ObjNa";s:$
14:09:25 | 32123 | DEBUG   | ScriptEngine         | Executing ScriptID: Präsenz\BlE-Scanner ~ Sender: RunScript
14:09:26 | 33244 | DEBUG   | ScriptEngine         | Executing ScriptID: Termine\Scheduler ~ Sender: TimerEvent
14:09:26 | 53646 | DEBUG   | ScriptEngine         | Executing ScriptID: FritzBox Socket\FBF Buf\FBF ~ Sender: RunScript
14:09:27 | 10911 | MESSAGE | VariableManager      | [Termine\Termin-Liste\TerminDaten] = a:7:{s:9:"Scheduler";a:15:{s:5:"EvtNa";s:9:"Scheduler";s:5:"EvtBe";s$
14:09:27 | 34349 | DEBUG   | ScriptEngine         | Executing ScriptID: Termine\Termin-Monitor ~ Sender: RunScript


Zeile 32 bis Zeile 86:

//0---- Skript muß nicht unbedingt ausgeführt werden, evtl. bis zum nächsten Event warten, aber nicht doppelte Ausgabe
if ( IPS_SemaphoreEnter(strval (HTML_Anrufer), 1000) ) {

....

    IPS_SemaphoreLeave(strval (HTML_Anrufer));       // und freigeben

} else {                                    
    if ( $IPS_SENDER == "Execute" ) {
        print("Semaphore HTML_Anrufer gesperrt");
    }
}  // Ende Semaphore-Kreis


Gebe zu, in Zeile 33 ist das ist noch die alte Masche mit den integer-Semaphoren jetzt umgewandelt in String; aber es sollte ja so sein wie unter der Windows-Version, und da läuft das mit integer-Semaphoren seit Jahren.

Und in Zeile 83 (mea culpa) hab ich noch die alte nicht mehr unterstützte Systemkonstante $IPS_SENDER stehen, ändere ich gleich in $_IPS[‚SENDER‘].

Aber wir sind uns ja fast einig „dass ein fehlerhaftes Script nicht IPS zum Absturz bringen“ darf.

und der Absturz fand dann erst 5 Sekunden später (oder noch später ?) statt.

Viele Grüsse
Harald

So ich hatte vorhin auch gleich zwei Crashs.

Einmal wieder versucht durch ein Script:
Habe die Laufzeit von 30 Sekunden überschritten, was den ganzen Dienst abgeschossen hat.
Im Log stand das nicht mehr, nur in der Console (IPS läuft bei mir zu Testzwecken nur in der Console)
Allerdings war es ein Script von einen PHP-Modul. Da ist IPS wohl etwas empfindlich.

Zweiter ‚Absturz‘ war eher ein Hänger, mal wieder beim schließen des ClientSocket.
Beim Shutdown blieb er dann beim Stoppe DataServer stehen.

Kann aber auch hier mit Semaphoren zusammenhängen, allerdings war da nichts offensichtliches.

EDIT: Gerade geschrieben sehe ich hier wieder die alte Meldung:
Cannot find semaphore! in…
passiert, beim Setzen derselben.

Allerdings läuft IPS ohne Probleme weiter. Und kann sie beim nächsten Aufruf wieder setzten.

Michael