2016-04-16 4 views
2

Hintergrund:Prevent shutdown/reboot bis Skript Hintergrund Python beendet

ich ein Python-Skript, das (unendlich) läuft vom Start im Hintergrund eines Ubuntu-Server. Der Prozess wird beendet, indem ein SIGINT gesendet wird, das von dem Skript behandelt wird, das alle Jobs vor dem Beenden beendet. Wenn jemand den Server herunterfährt und somit das Skript beendet, gehen wichtige Daten verloren. Ich habe mich gefragt, ob es eine Möglichkeit gibt, auf das Skript zu warten, bevor es heruntergefahren wird, oder das Herunterfahren vollständig zu verhindern (wenn es verhindert wird, dass es nett wäre, wenn es eine Nachricht anzeigen könnte).

Versuch:

Mein Python-Skript (test.py) einen SIGINT-Handler, wo, wenn er eine SIGINT empfängt, alle Aufgaben beendet vor dem Beenden. Ich schrieb den folgenden Shell-Skript:

PROCESS=$(pgrep -f 'python test.py') 
echo $PROCESS 
kill -2 $PROCESS 
while kill -2 $PROCESS 2> /dev/null; do 
     sleep 1 
done 

Dieses Skript kontinuierlich Kill Befehle an den Python-Skript senden, bis es beendet (es funktioniert, wenn Lauf). Ich habe das Skript in das Verzeichnis init.d, chmod -x im Skript gestellt, habe symlinks zu den Verzeichnissen rc0.d und rc6.d gemacht, deren Namen mit K99 beginnen. Da Skripte im Verzeichnis rc0.d/rc6.d beim Herunterfahren/Neustart ausgeführt werden, sollte das Skript (theoretisch) ausgeführt werden und warten, bis das Python-Skript beendet/neu gestartet wird. Das scheint nicht zu funktionieren. Es wird heruntergefahren/neu gestartet, ohne die Aufgaben zu beenden.

+0

Wenn Ihr Skript eigenständig korrekt ausgeführt wird, besteht das Problem wahrscheinlich darin, wie Sie es haken. Wenn Sie sicher sind, dass es ausgeführt wird, liegt das Problem wahrscheinlich daran, dass die benötigten Ressourcen deaktiviert wurden (Diskette wurde nicht gemountet?) Oder dass etwas anderes Ihren Prozess bereits beendet hat. Ohne Einzelheiten über diese Dinge können wir nur spekulieren; nicht unbedingt ein Programmierproblem (oder zumindest nicht in dem von Ihnen geposteten Code). – tripleee

+0

Wenn Sie 'pgrep' haben, haben Sie vermutlich' pkill'. – tripleee

+0

Vielleicht ersetzt 'sleep 1' durch' shutdown -c'? – Helio

Antwort

1

Das System sendet bereits ein Signal an alle laufenden Prozesse als Teil der normalen Abschaltsequenz, aber es ist kein SIGHUP. Ändern Sie Ihr Programm, um stattdessen zu handhaben (oder, um alle Möglichkeiten auch abzudecken. Während Sie dabei sind, fügen Sie vielleicht auch SIGINT hinzu).

Sie müssen den Shutdown-Skripten nichts hinzufügen. Ich denke, der Grund, warum Sie es nicht zum Laufen bringen konnten, war, dass der Prozess bereits zu dem Zeitpunkt beendet wurde, an dem Ihr Skript lief.

Verwandte Themen