Ich habe einen systemd-Dienst (für heka), der mir einige Kopfschmerzen bereitet.
Das Problem ist, dass „start“ erfolgreich zurückkehrt, selbst wenn der Heka-Daemon kurz nach dem Start beendet wird. Dies geschieht, wenn die Konfigurationsdateien falsch sind. Beispiel: Der Prozess wird gestartet, überprüft die Konfiguration und beendet sich, wenn er mit dem Ergebnis nicht zufrieden ist. Systemd kehrt in diesem Fall erfolgreich zurück.
Gibt es eine Möglichkeit, systemd zu zwingen, den Programmstatus nach der Initialisierung zu überprüfen? Vielleicht indem man n Sekunden nach dem Start des Prozesses in den Ruhezustand wechselt?
Dies ist das Skript:
[Unit]
Description=Heka event/metric/log collection and routing daemon
After=network.target auditd.service
ConditionPathExists=!/etc/heka/hekad_not_to_be_run
[Service]
EnvironmentFile=-/etc/default/heka
Type=simple
PIDFile=/var/run/hekad.pid
ExecStart=/usr/bin/hekad -config=/etc/heka
ExecReload=/bin/kill -HUP $MAINPID
KillMode=process
Restart=on-failure
StandardError=inherit
[Install]
WantedBy=multi-user.target
Alias=heka.service
Antwort1
Sie können mehrere ExecPostStart-Befehle miteinander verketten. Und Sie können sie ausführen, selbst wenn der Haupt-ExecStart fehlgeschlagen ist, indem Sie einen-/(systemd.service: Typ=). Etwas wie das:
ExecStart=-/usr/bin/hekad -config=/etc/heka
ExecStartPost=/bin/sleep 3
ExecStartPost=/bin/kill -0 $MAINPID &>/dev/null
Dadurch wird sichergestellt, dass Sie die Funktion weiterhin MAINPID
verwenden können, wenn Sie beispielsweise den Dienst stoppen oder neu starten.
Antwort2
Wenn es eine einfache Möglichkeit gibt, zu prüfen, ob hekad
noch aktiv ist, würde ich den Daemon starten ExecStartPre=/usr/bin/hekad -config=/etc/heka
und ExecStart
ein kleines Skript ausführen, das eine Schleife enthält, die zuerst X Sekunden lang schläft und dann prüft, ob der Hekad-Daemon noch läuft. Die Schleife wird nur unterbrochen, wenn es so hekad
aussieht, als ob er gestoppt wurde.
Antwort3
Sie sollten verwenden, ExecStartPost
um einen Befehl oder ein Skript zu starten, das in den Ruhezustand wechselt und dann eine Prüfung ausführt. Wenn dies ungleich Null endet, gilt die Einheit als fehlerhaft.
Sehen:https://www.freedesktop.org/software/systemd/man/systemd.service.html