Wie festhängende Skripte automatisch beenden?

Hallo Zusammen,

nachdem ich vor einiger Zeit leider festgestellt habe, dass IPS bzw. PHP kein Zeitlimit für Skripte mehr besteht, bringt mir das ab und an „Ärger“:

Mein IPS wird jede Nacht um 3:00 beendet und der Ordner wird als Zip weggesichert. Danach wird IPS wieder gestartet. (Linux, Bullseye)
Leider passiert aber ab und an (sehr selten) folgendes: Ein Skript hängt sich auf bzw. läuft nicht zu Ende und IPS fährt dann auch nicht zu Ende runter.

Dann muss ich den Host händisch per SSH rebooten.
Wie kann ich hängende Skripte detektieren und nach eine bestimmten Dauer beenden? Oder alternativ, wie kann ich bestimmte Skripte nach einer gewissen Zeit zwangsbeenden?
(Eins davon ist z.B. die Abfrage von Daten aus der VW WeConnect-Cloud, das führt ab und an zu o.g. Problem).

Gruß,
Maeffjus

Gar nicht. Zwangsbeenden ist nicht möglich, außer durch Killen des Dienstes. Das Detektieren geht, indem du die laufenden Threads bzgl. Laufzeit auswertest. Das ist natürlich nur ein Indiz (es kann ja durchaus Skripte geben, die erst nach langer Zeit fertig werden).

1 „Gefällt mir“

überhaupt nicht :wink: , dafür musst du Symcon neu starten

1 „Gefällt mir“

Das Problem ist, es hängt z.B. der Datenabruf von meinem Arteon - dann kann ich das ggf. sogar sehen und genau garnichts machen?
Denn - wenn IPS um 3:00 hängt, dann macht die Heizung um 7:00 auch kein Warmwasser :wink:

Hat vielleicht jemand denn konkret am Skript ne Idee:

<?php
 $output = exec('sudo -i -u dietpi /home/dietpi/.local/bin/weconnect-cli --username GEHEIM get /vehicles/WVWZZZ3HZNE506254/domains/charging/batteryStatus/currentSOC_pct');
 SetValueInteger(12994,$output);

$output2 = exec('sudo -i -u dietpi /home/dietpi/.local/bin/weconnect-cli --username GEHEIM get /vehicles/WVWZZZ3HZNE506254/domains/measurements/rangeStatus/electricRange');
 SetValueInteger(21047,$output2);

$output3 = exec('sudo -i -u dietpi /home/dietpi/.local/bin/weconnect-cli --username GEHEIM get /vehicles/WVWZZZ3HZNE506254/domains/charging/chargingStatus/remainingChargingTimeToComplete_min');
 SetValueInteger(39972,$output3);

$output4 = exec('sudo -i -u dietpi /home/dietpi/.local/bin/weconnect-cli --username GEHEIM get /vehicles/WVWZZZ3HZNE506254/domains/climatisation/climatisationStatus/climatisationState');
 If ($output4 == "off") {
 SetValueInteger(35908,0);
 }
 elseif ($output4 == "cooling") {
SetValueInteger(35908,1);
 }
 elseif ($output4 == "heating") {
SetValueInteger(35908,2);
 }

$date=strtotime(date("h:i:sa"))+($output3*60); 
$fertig=date("H:i:s",$date);

SetValueString(20388,$fertig);
SetValueInteger(52836, $date);

//var_dump($date);

Ja, das ist leider so.

Aus meiner Sicht sind die externen Befehle die einzige Möglichkeit, wo was hängen bleiben kann, weil das Skript auf deren Ausführung wartet, bevor es weiter macht.
Hast du mal IPS_Execute() mit Wartezeit versucht oder > /dev/null 2>/dev/null & ans Ende deines Befehls von exec() anzuhängen, damit die Ausführung von exec() asynchron läuft?

Aber dann kann es natürlich sein, dass dein Variablen-Status nicht mehr zu deinen Ausführungen passt.

Ich hatte letztens auch ein Script das exec() nutzte und hing. Als ich dann den Process auf der Konsole mit kill abgeschossen hatte - kam das Script wieder zurück :slight_smile:

Sonst gilt - wie hier schon geschrieben - geht nicht!

Gruß Heiko

Laufen die einzelnen PHP Prozesse separat sichtbar im Linux? Oder hast du das externe Programm abgeschossen?

Wenn es immer ein und das selbe externe Programm ist, kann man sich da schon was bauen, um es abzuschießen.

Ich hab das externe Programm abgeschossen!