Warum ist mein Systemd-Gerät geladen, aber inaktiv (tot)?

29

Ich versuche Graphite auf meinem Server einzurichten . Ich kann den Carbon Cache-Daemon problemlos starten sudo /opt/graphite/bin/carbon-cache.py start, habe aber Mühe, ihn als Systemd-Einheit auszuführen.

Folgendes habe ich in meiner Servicedatei graphite.service:

[Unit]
Description=Carbon for Graphite

[Service]
ExecStart=/opt/graphite/bin/carbon-cache.py start

[Install]
WantedBy=multi-user.target

Aber wenn ich das Gerät starte, erhalte ich den folgenden Status:

$ systemctl status graphite.service            
* graphite.service - Carbon for Graphite
   Loaded: loaded (/etc/systemd/system/graphite.service; enabled)
   Active: inactive (dead) since Fri 2014-06-13 18:44:11 UTC; 2s ago
  Process: 4525 ExecStart=/opt/graphite/bin/carbon-cache.py start (code=exited, status=0/SUCCESS)
 Main PID: 4525 (code=exited, status=0/SUCCESS)

Jun 13 18:44:11 MEADOW systemd[1]: Started Carbon for Graphite.

Journalctl liefert keine weiteren Informationen.

Wie soll ich Geräte mit dem Status "inaktiv (tot) ... (Code = beendet, Status = 0 / ERFOLG)" interpretieren und debuggen? Ich habe schon einmal fehlerhafte Einheiten gesehen, aber diese wurde erfolgreich geladen, läuft aber nicht und ich weiß nicht, was das bedeutet.

Ryne Everett
quelle
4
Dies bedeutet, dass systemd seinen Job abgeschlossen hat. Sollte es keine Type=Option geben? Siehe man systemd.servicefür einen geeigneten Typ.
Jasonwryan
1
Das macht Sinn. Alles was ich tun musste, war Type=forkingden [Service]Abschnitt zu ergänzen .
Ryne Everett

Antworten:

26

Laut jasonwryans Kommentar Type=simplefunktioniert die Standardeinstellung für viele Systemd-Servicedateien nicht, wenn das Skript einen ExecStartanderen Prozess startet und abschließt, wie dies bei carbon-cache.py von graphite der Fall ist. In diesen Fällen müssen Sie Type=forkingim [Service]Abschnitt explizit angeben, damit Systemd den erzeugten Prozess und nicht den ursprünglichen Prozess betrachten kann.

Wie erklärt in man systemd.service:

Wenn Forking eingestellt ist, wird erwartet, dass der mit ExecStart = konfigurierte Prozess fork () als Teil seines Starts aufruft. Es wird erwartet, dass der übergeordnete Prozess beendet wird, wenn der Start abgeschlossen ist und alle Kommunikationskanäle eingerichtet sind. Das untergeordnete Element wird weiterhin als Hauptdämonprozess ausgeführt. Dies ist das Verhalten traditioneller UNIX-Daemons. Wenn diese Einstellung verwendet wird, wird empfohlen, auch die Option PIDFile = zu verwenden, damit systemd den Hauptprozess des Dämons identifizieren kann. systemd startet die Folgeeinheiten, sobald der übergeordnete Prozess beendet ist.

Graphitspezifische Antwort

Während das oben Genannte mein Systemd-Problem löste, stieß ich schnell auf graphitspezifische Probleme (mit Twisted) und kehrte zum Standard zurück Type.

Graphit <0.9.12

In früheren Versionen von Graphite kann man das Gabeln nur mit der --debugOption vermeiden :

[Service]
ExecStart=/opt/graphite/bin/carbon-cache.py --debug start

Graphit> = 0,9,13

In dieser Pull-Anfrage wurde eine --no-daemonOption zusammengeführt:

[Service]
ExecStart=/opt/graphite/bin/carbon-cache.py --no-daemon start
Ryne Everett
quelle