2016-04-24 10 views
1

Ich verwende systemd auf Raspbian, um ein Python-Skript script.py auszuführen. Die my.service Datei sieht wie folgt aus:Linux: Machen Sie systemd sofort ein laufendes Python-Skript beenden?

[Unit] 
Description=My Python Script 
Requires=other.service 

[Service] 
Restart=always 
ExecStart=/home/script.py 
ExecStop=/home/script.py 

[Install] 
WantedBy=multi-user.target 

Wenn die Required=other.service stoppt, ich will my.service sofort stoppen und auch Python-Prozess läuft script.py beenden.

Wenn dies jedoch durch other.service Stoppen Ausprobieren und Überwachung dann den Zustand der my.servicesystemctl verwenden, scheint es, wie es gut, während nimmt für my.service tatsächlich eintreten a ‚fehlgeschlagen‘ Zustand (angehalten). Es scheint, dass der Aufruf ExecStopan das Skript ist nicht genug, um my.service selbst und die anschließende script.py in einer Minute zu beenden.

Nur um zusätzliche klar: Ich möchte das Skript ziemlich sofort in einer Art und Weise zu beenden, die zu Ctrl +C analog ist. Grundlegende Python-Bereinigung ist in Ordnung, aber ich möchte nicht systemd warten auf eine 'anmutige' Antwortzeit oder so etwas.

Fragen:

  1. Ist meine Interpretation der Verzögerung richtig, oder ist es nur systemctl, die ihre Statusübersicht aktualisieren langsam ist?
  2. Was ist der empfohlene Weg, um den Dienst zu stoppen und das Skript zu beenden. Sollte ich eine Art von SIGINT im Python-Skript einfangen? Wenn das so ist, wie? Oder gibt es etwas, das in my.service getan werden kann, um das Beenden des Dienstes und das Töten des Skripts zu beschleunigen?
+1

Haben Sie versucht, mit 'BindsTo' statt' Requires'? –

+0

@DougLuce Das sieht im Allgemeinen wie ein guter Vorschlag aus. Aber ich habe es jetzt versucht, und der Zustand von in 'systemctl' ist immer noch 'my.service loaded deactivating stop' für mindestens eine Minute, bevor es 'loaded failed failed' wird. – Winterflags

+0

Dies ist hier nicht verfügbar. – edmz

Antwort

2

Ich denke, Sie sollten in TimeoutStopSec suchen und es ist Standardwert param DefaultTimeoutStartSec. Auf den priovierten Links gibt es weitere Informationen über WatchdogSec und andere Optionen, die Sie möglicherweise nützlich finden. Es sieht aus wie DefaultTimeoutStartSec 's Standard ist 90 Sekunden, was könnte die Verzögerung sein, die Sie erleben ..?

1

Unter Optionen für Einheitsabschnitte sollten Sie Requisite=other.service verwenden. Dies ist vergleichbar mit Requires=. Wenn jedoch die hier aufgeführten Einheiten nicht bereits gestartet wurden, werden sie nicht gestartet und die Transaktion schlägt sofort fehl.

Um die Ausführung eines Skripts erneut im Einheitenabschnitt zu starten, können Sie OnFailure= verwenden. Dies ist eine durch Leerzeichen getrennte Liste von einer oder mehreren Einheiten, die aktiviert werden, wenn diese Einheit den Status "failed" erreicht.

Die Option BindsTo= konfiguriert auch Anforderungsabhängigkeiten, die dem Stil Requires= sehr ähnlich sind. Zusätzlich zu diesem Verhalten wird jedoch auch angegeben, dass dieses Gerät gestoppt wird, wenn eine der aufgelisteten Einheiten plötzlich verschwindet. Einheiten können plötzlich unerwartet verschwinden, wenn ein Dienst nach eigener Wahl beendet wird, ein Gerät getrennt wird oder ein Bereitstellungspunkt ohne Einbeziehung von Systemd ausgehängt wird.

Ich denke in Ihrem Fall BindsTo= ist die Option zu verwenden, da es bewirkt, dass die aktuelle Einheit zu stoppen, wenn die zugehörige Einheit beendet wird.

From systemd.unit man

+1

zu meiner Antwort hinzugefügt ich dünn sollten Sie 'BindsTo =' verwenden, und das sollte ausreichen – PoX