Demonizzare un processo in shell?


9

http://linuxg.net/how-to-transform-a-process-into-a-daemon-in-linux-unix/ fornisce un esempio di demonizzazione di un processo in bash:

$ nohup firefox& &> /dev/null

Se sono corretto, il comando è lo stesso di "nohup e background a process". Ma un demone non è altro che un processo non supportato e in background?

Quali passi mancano qui per demonizzare un processo?

Ad esempio, non è necessario modificare il processo padre durante la demonizzazione di un processo? Se sì, come fai in bash? Sto ancora cercando di capire una risposta correlata https://unix.stackexchange.com/a/177361/674 .

Quali altri passaggi e condizioni?

Vedi la mia domanda correlata https://stackoverflow.com/q/35705451/156458


1
dipende dalla tua definizione di demoni. Se intendi semplicemente eseguire in background staccato da un terminale, sì, stai eseguendo Firefox come demone. I demoni "standard", tuttavia, in genere non sono gestiti dagli utenti, hanno uno script e una registrazione di init, e in genere una sorta di sicurezza, spesso apparmor o selinux a seconda che si stia eseguendo Ubuntu o Fedora (o simili). Vedi linfo.org/daemon.html .
Pantera,

1
Dai un'occhiata a start-stop-daemon Debian; Lascerò qui un thread correlato da overflow dello stack stackoverflow.com/questions/16139940/… che è più interessante della pagina man grezza
Rui F Ribeiro,

Risposte:


10

Dal voci di Wikipedia daemon :

In un ambiente Unix, il processo parent di un demone è spesso, ma non sempre, il processo init. Un demone di solito viene creato da un processo che crea un processo figlio e quindi esce immediatamente, facendo in modo che init adotti il ​​processo figlio o dal processo init che avvia direttamente il daemon. Inoltre, un demone lanciato da biforcazione ed uscita in genere deve eseguire altre operazioni, come dissociare il processo da qualsiasi terminale di controllo (tty). Tali procedure sono spesso implementate in varie routine di convenienza come daemon (3) in Unix.

Leggi la manpage della daemonfunzione.

L'esecuzione di un comando in background da una shell che esce immediatamente provoca il PPID del processo diventando 1. Facile da testare:

# bash -c 'nohup sleep 10000 &>/dev/null & jobs -p %1'
1936
# ps -p 1936
      PID    PPID    PGID     WINPID   TTY         UID    STIME COMMAND
     1936       1    9104       9552  cons0       1009 17:28:12 /usr/bin/sleep

Come puoi vedere, il processo è di proprietà di PID 1, ma è ancora associato a un TTY. Se esco da questa shell di accesso, quindi eseguo nuovamente l'accesso e lo faccio di psnuovo, il TTY diventa ?.

Leggi qui perché è importante staccare da TTY .

Utilizzando setsid(parte di util-linux):

# bash -c 'cd /; setsid sleep 10000 </dev/null &>/dev/null & jobs -p %1'
9864
# ps -p 9864
      PID    PPID    PGID     WINPID   TTY         UID    STIME COMMAND
     9864       1    9864       6632  ?           1009 17:40:35 /usr/bin/sleep

Penso che non devi nemmeno reindirizzare stdin, stdout e stderr.


3
Dai un'occhiata a daemonize . Oltre a un bel strumento, ha spiegazioni abbastanza buone su cosa sia un demone.
Gene Pavlovsky,

Sono solo curioso di sapere se conosci un modo per dissociare il processo dal tty senza disconnettersi dalla shell da cui è stato generato il processo?
StoneThrow,

1
@StoneThrow "senza disconnettersi dalla shell da cui è stato generato il processo" Se si utilizza il bash -cwrapper, non vi è alcun TTY associato al processo. È proprio come l'ha dimostrato.
Bruno Bronosky,

@StoneThrow ma facendo questo test echo "outer tty: $(tty)"; ls -la $(dirname $(tty)); bash -c 'echo "inner tty: $(tty)"; ls -la $(dirname $(tty));'ti mostrerà che è lo stesso TTY esatto per entrambi, ma il comportamento dimostrato di ottenere un TTY di ?accade ancora anche se non stai mai "disconnettendoti dalla shell" né chiudendo il TTY.
Bruno Bronosky,

-1

Un demone, con il suo nome non è altro che un programma che gira fino al 1. il sistema è spento; 2. è richiesto di fermarsi. A parte questo, non ha alcun significato magico.

In tali circostanze, eseguendo uno script bash in background con nohup, è possibile classificarlo come processo daemon.

Cosa ti aspetti di trovare e non trovare? In caso di problemi, si prega di indicarli con codice di esempio e segmenti di dati di esempio per chiedere ulteriore aiuto. La tua domanda, così com'è adesso, è troppo ampia / generale.


Grazie. Penso che il mio post abbia tutto ciò che hai richiesto nel tuo ultimo paragrafo.
Tim

4
Questo non è vero. Un demone non ha Terminale di controllo, non ha stdout o stderr e altre cose. Leggi la prima strofa di software.clapper.org/daemonize
Rich Homolka il
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.