So schreiben Sie ein benutzerdefiniertes Runit-Stoppskript

12

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 killich anstelle von einfach einen brauche "killtree", um sie loszuwerden. Wie mache ich das?

Ich weiß, dass dies über die controlOptionen von runit erfolgen sollte, aber beim Lesen der Dokumente ist mir nicht wirklich klar, wie das Stoppskript benannt werden soll :(

http://smarden.org/runit/runsv.8.html

ddinchev
quelle
Ihr Dienst (nicht das Skript, sondern das Programm) klingt schlecht, er sollte nach seinen eigenen Kindern ernten / bereinigen. Nur neugierig, was ist das?
Avery Payne

Antworten:

13

Aus den Dokumenten

Für jedes an die Steuerleitung gesendete Steuerzeichen c prüft runningv zunächst, ob service / control / c vorhanden und ausführbar ist. In diesem Fall wird service / control / c gestartet und auf die Beendigung gewartet, bevor der Befehl interpretiert wird. Wenn das Programm mit dem Rückkehrcode 0 beendet wird, verzichtet runv darauf, dem Dienst das entsprechende Signal zu senden. Der Befehl o wird immer als Befehl u betrachtet. Auf Befehl d wird zuerst service / control / t und dann service / control / d überprüft. Auf Befehl x wird zuerst service / control / t und dann service / control / x überprüft. Die Steuerung des optionalen Protokolldienstes kann nicht angepasst werden.

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örigen svBefehl wie den dBefehl (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.

Core-Dump
quelle
Es ist wirklich interessant und einfach, wie Runsv Dir funktioniert.
Dzung Nguyen
2

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.

Rik Schneider
quelle
1
Service / Finish wird ausgeführt, nachdem TERM CONT an den laufenden Service gesendet wurde. Es ist eher wie ein Clearing-Service nach dem Töten.
MaximKostrikin
2

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 tDatei 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.

#!/bin/bash
kill -INT `cat /tmp/project-master.pid`

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.

itsafire
quelle