2016-05-17 13 views
0

Das Wesen:Hinzufügen eines Python-Daemon zum systemd

ich einen Daemon erstellt haben einige Aufgaben auf einem Remote-Plattform zu verwalten. Es ist in Python geschrieben und akzeptiert Start, Stopp und Neustart von Argumenten. Beim Versuch, es zum Systemd hinzuzufügen (so würde es beim Systemstart starten und beim Herunterfahren usw. gestoppt werden), stieß ich auf ein Problem: Es scheint Dämon laufen zu sehen, aber ich bin nicht sicher, ob es tatsächlich funktioniert, weil Neustart oder Status kehrt mit einem Fehler anfordernden:

[[email protected] ~]# systemctl restart mydaemon 
Failed to restart mydaemon.service: Unit mydaemon.service failed to load: No such file or directory. 

[[email protected] ~]# systemctl status mydaemon 
● mydaemon.service 
    Loaded: not-found (Reason: No such file or directory) 
    Active: inactive (dead) 

die Besonderheiten:

der Code selbst folgt mit sehr wenigen Änderungen der bekannte example von Sander Marechal. An sich funktioniert es ohne Probleme und reagiert angemessen auf alle akzeptierten Argumente. Die PID wird in /tmp/my-daemon.pid gespeichert.

Die systemd Service-Datei im Verzeichnis Benutzer-Daemons: /usr/lib/systemd/user/mydaemon.service, und der Code ist wie folgt:

[Unit] 
Description=The user daemon 

[Service] 
Type=forking 
ExecStart=/usr/bin/python /home/frcr/mydaemon_v01.py start 
ExecStop=/usr/bin/python /home/frcr/mydaemon_v01.py stop 
RestartSec=5 
TimeoutSec=60 
RuntimeMaxSec=infinity 
Restart=always 
PIDFile=/tmp/my-daemon.pid 


[Install] 
WantedBy=multi-user.target 

systemctl den Status als aktiv zurückkehrt, aber nur, wenn die pid vorgesehen:

[[email protected] ~]# systemctl status 9177 
● session-481.scope - Session 481 of user user 
    Loaded: loaded 
    Drop-In: /run/systemd/system/session-481.scope.d 
      └─50-After-systemd-logind\x2eservice.conf, 50-After-systemd-user-sessions\x2eservice.conf, 50-Description.conf, 50-SendSIGHUP.conf, 50-Slice.conf 
    Active: active (running) since Tue 2016-05-17 06:24:51 EDT; 1h 43min ago 
    CGroup: /user.slice/user-0.slice/session-481.scope 
      ├─8815 sshd: [email protected]/0 
      ├─8817 -bash 
      ├─9177 python /home/user/mydaemon_v01.py start 
      └─9357 systemctl status 9177 

Ich habe eine similar question hier auf Stack-Überlauf gesehen, aber es scheint nicht die Lösung für mein Problem zu haben.

Ich nehme an, ich vermisse etwas sehr offensichtlich wegen des schieren Mangels an Erfahrung mit Systemd, und ich wäre sehr dankbar, wenn jemand es für mich zeigen oder mir die richtige Richtung zeigen könnte. Danke im voraus und bitte verzeih mir meine verrückten Englischkenntnisse.

Antwort

2

Das Aktivieren des Daemon mit einem vollständigen Pfadnamen hat das Problem umgangen, aber es gibt eine bessere Lösung.

Das Problem war der Service in einem Verzeichnis Benutzer war aber wurde als System Dienst gestartet. Allerdings /usr/lib war nicht der richtige Ort, um neue Service Dateien trotzdem hinzuzufügen. Dieses Verzeichnis ist für Dateien vorgesehen, die im Lieferumfang von Betriebssystempaketen enthalten sind. Das korrekte Verzeichnis zum Hinzufügen eines neuen Systems ist in /etc/systemd/system Siehe related docs about systemd paths.

Sie möchten immer noch enable der Dienst, um sicherzustellen, dass es beim Booten geladen wird.

+0

Danke, das ist wirklich hilfreich. Ich werde versuchen, beim nächsten Mal mehr auf die Dokumente zu achten. –

0

Nach einigen zusätzlichen Googeln fand ich eine Lösung: Ich habe vergessen, um tatsächlich den Dämon zu systemctl hinzufügen:

[[email protected] ~]# systemctl enable /usr/lib/systemd/user/mydaemon.service 
Created symlink from /etc/systemd/system/multi-user.target.wants/mydaemon.service to /usr/lib/systemd/user/mydaemon.service. 
Created symlink from /etc/systemd/system/mydaemon.service to /usr/lib/systemd/user/mydaemon.service. 

Es lohnt sich auch, dass der absolute Pfad erforderlich ist, zu erwähnen.

Das einzige, was links ist systemctl aufzufrischen:

[[email protected] ~]# systemctl daemon-reload 

Danach wird der Dienst hinzugefügt wird, und

[[email protected] ~]# systemctl start mydaemon 
[[email protected] ~]# systemctl restart mydaemon 
[[email protected] ~]# systemctl stop mydaemon 

alles perfekt funktionieren.