Wie kann man systemctl mitteilen, dass der Dienst bereits gestartet ist?

783
Wernfried Domscheit

Ich habe eine Service-Unit-Datei mediation.servicewie diese:

[Unit] Description=Mobile-IP Log dumper  [Service] Type=forking ExecStart=/opt/mediation/mediation start ExecStopPost=/opt/mediation/mediation stop ExecReload=/opt/mediation/mediation reload PIDFile=/var/lib/mediation/syslog-ng.pid 

Nehmen Sie nun an, dass jemand den Dienst direkt startet, /opt/mediation/mediation startanstatt ihn zu verwendensystemctl start mediation

In diesem Fall systemctl status mediationwird zeigen:

● mediation.service - Mobile-IP Log dumper Loaded: loaded (/etc/systemd/system/mediation.service; enabled; vendor preset: disabled) Active: inactive (dead) since Mon 2016-07-11 11:24:11 CEST; 8s ago Process: 14088 ExecStopPost=/opt/mediation/mediation stop (code=exited, status=0/SUCCESS) Process: 13482 ExecStart=/opt/mediation/mediation start (code=exited, status=0/SUCCESS) Main PID: 13746 

Ist es möglich, dass systemctl status mediationder korrekte Status (dh der laufende Status) des Dienstes angezeigt wird? Sieht aus, als würde systemctl die PID-Datei nicht neu laden, wenn der Status überprüft wird, da in diesem Fall alle Informationen verfügbar wären und der richtige Status bekannt ist.

0
Mobile-IP? Funktioniert das heute noch und wie kann ich es funktionieren lassen? grawity vor 8 Jahren 0
"Mobile-IP" ist nur unser interner Name der Anwendung. Es hat nichts mit dem Mobile-IP-Protokoll zu tun - vielleicht ist der Name nicht sehr schlau, aber jetzt ist es zu spät, um es zu ändern. Wernfried Domscheit vor 8 Jahren 0

2 Antworten auf die Frage

2
grawity

Nein, das kannst du nicht.

Das Service-Tracking von systemd basiert hauptsächlich auf cgroups, daher kann der Prozess nicht als Teil von angesehen werden, es mediation.servicesei denn, er befindet sich innerhalb der entsprechenden cgroup. (So ​​werden Benutzeranmeldungen beispielsweise von sshd.service abgebrochen: durch Wechseln zu einer anderen cgroup.) PID-Dateien sind nicht wichtig, obwohl sie für die zusätzliche Überprüfung verwendet werden.

Aber auch wenn der Prozess manuell in die richtige cgroup verschoben wird (über / sys / fs / cgroup / systemd), wird der gesamte Dienst immer noch nicht als "aktiv" betrachtet, wenn er nicht über systemd gestartet wurde .


In Debian- und anderen Distributionen, die immer noch eine Mischung aus /etc/init.dSkripten enthalten, wird dies gelöst, indem das allgemeine Scriptlet "LSB-Funktionen" bearbeitet wird, um das Initscript automatisch über systemctl erneut auszuführen, wenn es manuell aufgerufen wird.

Aber um Daemons direkt zu starten, tun Sie das nicht? Oder erstellen Sie ein ähnliches Wrapper-Skript, das auch manuelle Starts zu systemctl umleitet.

0
Wernfried Domscheit

Da es keine direkte Lösung gibt, könnte eine Problemumgehung dazu beitragen, dem Skript solche Zeilen hinzuzufügen.

if [[ ! `ps --no-headers -o args -p $PPID | grep systemd` ]] ; then  echo "You must start the application with 'systemctl start mediation'" exit 1 fi 

Dadurch wird verhindert, dass der Dienst außerhalb von systemctl gestartet wird.