Was passiert, wenn Sie den Dienst manuell über die Befehlszeile starten (ohne den nohup
Präfixbefehl oder das &
Suffix zu verwenden, um ihn im Hintergrund auszuführen, oder mit anderen Worten, führen Sie einfach den Befehl aus, den Sie in die ExecStart=
Zeile der .service
Datei einfügen würden)?
a) Wenn der Dienst gestartet wird und weiter ausgeführt wird und die Eingabeaufforderung erst zurückkehrt, wenn Sie Strg-C drücken oder den Dienst auf andere Weise beenden, Type = simple
ist dies die richtige Wahl.
b) Wenn die Eingabeaufforderung zurückgegeben wird, der Dienst jedoch weiterhin im Hintergrund ausgeführt wird (dh der Dienst dämonisiert sich selbst), Type = forking
ist dies die richtige Wahl.
c) Wenn der Dienst seine Arbeit erledigt und zur Eingabeaufforderung zurückkehrt, ohne dass etwas ausgeführt wird (dh der Dienst passt nur einige Kerneleinstellungen an, sendet einen Befehl an etwas anderes oder führt etwas Ähnliches aus), Type = oneshot
ist dies wahrscheinlich die richtige Wahl. In diesem Fall ExecStart
könnte der Dienst der Befehl sein, etwas zu "setzen", und ExecStop
der entsprechende Befehl, um es zu "deaktivieren". Dieser Typ profitiert normalerweise von RemainAfterExit=true
, sodass systemd den "Status" dieses Dienstes nachverfolgt, je nachdem, ob das Objekt zuletzt "gesetzt" oder "nicht gesetzt" wurde.
Die anderen Type
Werte sind Sonderfälle. Wenn der Dienst beispielsweise eine D-Bus-Verbindung verwendet, ist dies Type = dbus
möglicherweise die beste Wahl. Es macht systemd
sich der Tatsache bewusst, und dann verfolgt systemd diesen Dienst (und alles, was davon abhängt) durch das Vorhandensein dieses Dienstes auf dem D-Bus.
Zur Verwendung Type = notify
muss der Prozess in der Lage sein, eine Verbindung zum in der Umgebungsvariablen angegebenen Unix-Socket herzustellen $NOTIFY_SOCKET
und seinen Status zu melden, indem bei Bedarf Nachrichten an diesen Socket geschrieben werden. Außerdem sollte in der Servicedatei die NotifyAccess
Option angegeben werden, den entsprechenden Zugriff auf den Benachrichtigungssocket zu gewähren.
Es gibt ein Befehlszeilenprogramm systemd-notify
und eine C-Bibliotheksfunktion, mit der sd_notify(3)
Sie diese Nachrichten senden können. Wenn jedoch keine dieser Funktionen Ihren Anforderungen entspricht, können Sie einfach Ihren eigenen Nachrichtensender implementieren. Die erforderlichen Nachrichten sind sehr einfach und sehen aus wie Zuweisungen von Shell-Variablen: Um beispielsweise zu benachrichtigen, dass der Dienst den Start erfolgreich abgeschlossen hat und bereit ist, eingehende Anforderungen zu bearbeiten, sollte der Dienst die Zeichenfolge senden, die der Ausgabe von printf "READY=1\n"
an den Socket entspricht. Sehen Sie man 3 sd_notify
für weitere Informationen über die erkannten Nachrichten.
Hinweis: Viele Dienstanwendungen, die für viele Unix-Systeme portierbar sind, verhalten sich möglicherweise standardmäßig wie b), können jedoch wie folgt funktionieren: a) Durch Hinzufügen einer Option (normalerweise als "Nicht gabeln" bezeichnet), "Weiter ausführen" im Vordergrund "," nicht dämonisieren "oder ähnliches). In diesem Fall wäre es vorzuziehen, die Option hinzuzufügen und das Verhalten vom Typ a) zu verwenden, wenn die Option keine anderen Nebenwirkungen hat systemd
.
apache
, welcher Typ sollte verwendet werden?apachectl start
als root, vielleicht? Versuchen Sie es und sehen Sie, was passiert. Dann wähle a), b) oder c) aus meiner Antwort. Ich würde wetten, dass die Eingabeaufforderung zurückkehrt und Apache weiterhin ausgeführt wird, also wäre b) die Antwort.Type=notify
?Type=notify
hinzugefügten.