mehrfache Ausführung von Skripten verhindern

Ahoi :loveips: !

ich rufe mit IPS_RunScript in einem Skript (Master) ein Skript (Client) auf, das etwa 5min braucht und auf das ich im Master nciht warten will. Mein Problem: Starte ich den Master neu, so wird das darin enthaltene Clientskript ebenfalls erneut gestartet, und es laufen 2 von den Dingern.

Ich kann naürlich in dem Slaveskript eine Var setzen, um das zu prüfen - da müsste ich aber auch testen, ob das Clientscript unvorhergesehen aussteigt.

Kann ich irgendwie prüfen, ob ein bestimmtes Skript schon läuft ?

Ja kannst du.
Die laufen Scripte werden in einem Array der Aktiven PHP-Threads aufgeführt.
Finde den Befehl aber gerade nicht in der Doku (bin unterwegs).
Hätte sonst heute abend ein fertiges Script, welches ich dafür nutze, für dich.
Michael

Beste Lösung:


if(!IPS_SemaphoreEnter($_IPS['SELF'], 1 /* sehr kurz warten */)) {
 return; //Läuft bereits
}

.....

//Aufräumen. Falls das Skript vorher stirbt, gibt es eine weitere Fehlermeldung, aber die Semaphore wird trotzdem aufgeräumt!
IPS_SemaphoreLeave($_IPS['SELF']);

paresy

Moin!

Ich arbeite auch viel mit Semaphoren.

…aber an einer Stelle hab ich es mit einer Hilfsvariable „Blocked“ gelöst. Diese setze ich als erstes auf TRUE und am Ende vom Skript wieder auf FALSE. Und Frage in anderen Skripten dann ab und mache nur etwas, wenn die Variable auf FALSE ist. Und zusätzlich kann man noch auf die letzte Skriptausführung abfragen und das noch mit einbauen. Je nachdem wie wo was.

EDIT: Das meinte Michael wohl:

<?

// Anzahl der Threads ausgeben
$Threads = IPS_GetScriptThreadList();
//print_r($Threads);


// Threads ausgeben
for($i=1;$i<=count($Threads);$i++) {
	//print_r(IPS_GetScriptThread($i));
	$ThreadArray[$i] = IPS_GetScriptThread($i);
	if ($ThreadArray[$i]['ScriptID'] != 0) {
		echo $ThreadArray[$i]['ScriptID'].PHP_EOL;
	}
}

?>

Grüße,
Chris

Prima, vielen Dank für eure hilfreichen Beiträge.

Das mit den Semaphore scheint ja dafür gemacht - ich wusste bloss nicht, dass die auch beim vorzeitigen Abbruch aufräumen - wozu muss man dann eigtl noch das „Leave“ machen, ist das nur für den Fall, dass das Script ohne Fehler beendet wird ? Da ich im Script einige Aussteigspunkte habe - muss das Leave dann in jedem Ausstiegspunkt rein ?

Wäre gut, sonst hast du da Meldungen im Log.
Beeinträchtigt aber wie von Paresy geschrieben nicht die Funktion oder IPS negativ…
Michael