Setzen Sie RemainAfterExit=no für ein klassisches Init-Skript in systemd

Setzen Sie RemainAfterExit=no für ein klassisches Init-Skript in systemd

Ich führe einen benutzerdefinierten Dienst mit einem klassischen Init-Skript auf Debian Jessie aus. Debian Jessie verwendet systemd. Der Grund, warum ich ein Init-Skript verwende, ist, dass ich denselben Dienst auch auf Debian Wheezy verwende, das kein systemd hat.

Da der Dienst gelegentlich abstürzen kann, möchte ich, dass er neu gestartet wird, wenn er beendet wird. Meines Wissens kümmert sich systemd darum. Wenn ich den Dienst jedoch manuell beende (ohne systemctl stop service), systemctl statuswird der Dienst als gemeldet active (exited).

Meines Wissens nach bedeutet dies, dass systemd den Dienst einfach als einen Dienst betrachtet, der „ausgeführt“ werden kann, ohne dass ein Prozess vorhanden ist.In der Dokumentation wird RemainAfterExitals Möglichkeit zur Konfiguration dieses Verhaltens erwähnt, aber dies ist ein Flag zur Verwendung in einer Unit-Datei, ich habe nur ein Init-Skript.

Gibt es eine Möglichkeit, systemd mitzuteilen, dass ein Init-Dienst einen Prozess benötigt, um als aktiv zu gelten? Mit anderen Worten, ihm mitzuteilen, dass es sich active (exited)um einen unerwünschten Zustand handelt?

Antwort1

Ich habe das Problem gelöst, indem ich eine generische Boilerplate-Systemd-Unit-Datei geschrieben habe. Speichern Sie die Datei in /etc/systemd/system/$SERVICE.service.

Ersetzen Sie es $SERVICEdurch den Dienstnamen.

[Unit]
Description=$SERVICE init script wrapper
After=network.target

[Service]
ExecStart=/etc/init.d/$SERVICE start
ExecStop=/etc/init.d/$SERVICE stop
ExecReload=/etc/init.d/$SERVICE reload
PIDFile=/var/run/$SERVICE.pid
RemainAfterExit=no
Restart=always
Type=forking

[Install]
WantedBy=multiuser.target

Ausführen systemctl daemon-reload, um die internen Komponenten von systemd zu aktualisieren.

verwandte Informationen