Ich möchte ein benutzerdefiniertes "Stop" -Skript runit
( runsv
) haben, das ausgeführt werden soll, wenn der Prozess gestoppt / neu gestartet werden muss. Derzeit wird der Prozess einfach abgebrochen und anschließend das Skript "Fertig stellen" ausgeführt. Aber in meinem Fall erzeugt mein Prozess dynamisch untergeordnete Prozesse, sodass kill
ich anstelle von einfach einen brauche "killtree"
, um sie loszuwerden. Wie mache ich das?
Ich weiß, dass dies über die control
Optionen von runit erfolgen sollte, aber beim Lesen der Dokumente ist mir nicht wirklich klar, wie das Stoppskript benannt werden soll :(
Antworten:
Aus den Dokumenten
Das bedeutet, dass Sie ein erstellen müssen
service_name/control/X
, wobei X eine ausführbare Datei ist, die ausgeführt wird, wenn Sie den zugehörigensv
Befehl wie dend
Befehl (down) an den Dienst senden . Wenn Ihr Skript mit dem Status 0 beendet wird, wird nicht versucht, den Dienst selbst herunterzufahren.Grundsätzlich benötigen Sie ein ausführbares Skript
/etc/sv/<service>/control/d
, das alles tut, was Sie wollen, und den Dienst beendet, Pids bereinigt usw.quelle
Die einfache Antwort besteht darin, Ihr Bereinigungsskript "service / finish" zu nennen. Dieses Skript wird ausgeführt, wenn "service / run" beendet wird.
Es gibt auch eine "service / control / ctrl_char" -Schnittstelle. Sie ermöglicht es Ihnen, unterschiedliche Aktionen auszuführen, je nachdem, welchen Befehl Sie an runningv senden.
quelle
Ich musste dieses Problem für Docker selbst lösen. Ich hatte uwsgi Server ausgeführt, und es wurde das falsche Signal von Docker (TERM anstelle von INT) beim Stoppen des Containers gesendet.
Die Idee der control / x-Dateien besteht darin, auf ein empfangenes Signal zu reagieren. In meinem Fall würde ich eine
t
Datei für das Abschlusssignal in die Kontrolle bringen, da es die Datei ist, die für den Begriff Signal reserviert ist. Das Skript sollte ausführbar sein.Das Skript sendet ein int-Signal an den uwsgi-Prozess, was ich will.
Wenn das Steuerskript fehlerfrei beendet wird (Rückkehrcode 0), wird das ursprüngliche Signal nicht an den Prozess gesendet.
In meinem Fall konnte ich also das Term-Signal empfangen und stattdessen ein Int-Signal an den Service-Prozess senden.
quelle