Forking in uno script systemd


10

Voglio che il servizio systemd gestisca il fork (il mio file non gestisce il fork da solo. Quindi mi affido a systemd per gestirlo)

Il mio file .service:

[Unit]
Description=swamp services management service
After=syslog.target

[Service]
Type=forking
ExecStart=/usr/bin/swamp

[Install]
WantedBy=multi-user.target

Domanda

Specificare Type=forkingabbastanza per quello che sto cercando di ottenere? O è simile aspettarsi il fork in upstart che in realtà dice upstart (se capisco correttamente, non sono sicuro di esserlo, sono nuovo a scrivere initscripts) che il mio servizio gestirà il fork / demonizzazione.

Risposte:


16

systemd ha una documentazione eccellente. Vedi la pagina sui file di servizio :

Se impostato su biforcazione, si prevede che il processo configurato con ExecStart = chiamerà fork () come parte del suo avvio. Il processo padre dovrebbe terminare quando l'avvio è completo e tutti i canali di comunicazione sono impostati. Il bambino continua a essere eseguito come processo daemon principale. Questo è il comportamento dei demoni UNIX tradizionali. Se si utilizza questa impostazione, si consiglia di utilizzare anche l'opzione PIDFile =, in modo che systemd possa identificare il processo principale del daemon. systemd procederà con l'avvio delle unità di follow-up non appena termina il processo padre.

Quindi, l'utilizzo di questo typedirà semplicemente a systemd di attendere fino ai swampritorni e quindi di considerarlo ancora in esecuzione: far sì che ciò accada rimane la tua responsabilità ...


5
Se lo script non esegue alcun fork, è oneshot(uno script di breve esecuzione tipico) o simple(un servizio di lunga durata che non esegue il fork + uscita).
Pavel Šimerda,

4
Considereresti uno script (Bash?) Per biforcare un altro processo quando usa background e commerciale &?
Felipe Alvarez,

5
@FelipeAlvarez sì, l'operatore e commerciale in bash equivale a fork e exec.
Thayne,

1

Se si desidera che systemd gestisca il fork, è necessario utilizzare ad esempio Type=simpleo Type=notify. Quindi systemd farà il fork per te.

Se puoi modificare il swampfile eseguibile, allora Type=notifyè la soluzione migliore. L'eseguibile dovrebbe quindi avvisare systemd quando viene inizializzato correttamente. Ciò significa che systemctl start swampattenderà l'inizializzazione della palude quando viene chiamato dalla riga di comando e stamperà qualsiasi messaggio di errore durante l'inizializzazione alla riga di comando, che è ciò che di solito si desidera.

Per un esempio di un eseguibile scritto per utilizzare Type = notification, vedere il seguente shellscript:

#!/bin/bash                                                                     
sleep 3
systemd-notify READY=1
sleep 1000000
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.