Qual è la differenza tra start-stop-daemon e l'esecuzione con &?


18

Sto configurando un servizio in /etc/init.d. Sto guardando vari script lì dentro, alcuni sono implementati con start-stop-daemon ...e alcuni con /path/to/script &.

Tutti salvano il pid in un file e fanno alcuni controlli.

Qual è la migliore pratica, quali sono le differenze, cosa è importante sapere qui ...? (in generale)

Nel mio caso particolare ho un semplice server http localhost leggero in Java che un'applicazione chiamerà una volta ogni ora e dà solo uno stupido numero casuale (non ci sono più dettagli qui, voglio solo dire che non usa il file system o discussioni o qualcosa di complicato nel caso in cui la questione sia nella mia domanda)

Grazie

Risposte:


27

Un lavoro in background (es. Iniziato con &) ha ancora lo stdin, lo stdout e lo stderr collegati al terminale in cui è stato avviato. Potrebbe improvvisamente scrivere (ad es. Messaggi di errore) sul terminale ("disturbare" il lavoro nel primo piano) o mettere in pausa in attesa di input dalla tastiera (è necessario prima metterlo in primo piano). Naturalmente è possibile reindirizzare stdout e stderr su un file o su / dev / null per impedire al job in background di scrivere sul terminale.

Un lavoro in background può anche essere messo in primo piano - ad es. l'attuale lavoro in primo piano viene interrotto e il fgcomando (primo piano) viene utilizzato per mettere in primo piano un lavoro in background. Un lavoro in background può anche essere raggiunto da segnali provenienti dal terminale - ad es. SIGHUP quando chiudi il terminale, che di solito termina (la maggior parte) dei programmi avviati nel terminale.

Un demone - come quelli avviati automaticamente da init.d, ma che può anche essere avviato manualmente da un terminale - d'altra parte, viene disconnesso da qualsiasi terminale. Anche se è stato avviato manualmente da un terminale, un demone verrà disconnesso dal terminale, quindi non può né scrivere (stdout, stderr) né leggerlo (stdin). È anche "immune" ai segnali inviati "automaticamente" dal terminale. (sebbene sia possibile inviare segnali utilizzando kill -signal pid).

"Sfondo" e "primo piano" si riferiscono allo stato del processo ad alcuni terminali, indipendentemente dal fatto che sia il processo che attualmente controlla il terminale o meno. Dato che i demoni non sono collegati a un terminale (ma sono stati disconnessi in modo dinamico da esso in ogni modo), non si può quindi dire che stiano funzionando in background. I demoni sono solo processi in esecuzione senza essere associati a un terminale, né in primo piano né in background.

Se lo usi pscon le opzioni che mostrano quale terminale utilizza un processo, vedrai che sia il Fore sia lo sfondo sono associati a un terminale (es. Tty2). I demoni invece hanno un "?" in questo campo.

I demoni di solito si comportano come tali, anche se vengono avviati manualmente. La creazione di un tuo demone è un po 'faticosa: ci sono alcuni trucchi per disconnetterlo totalmente dal terminale. È necessario creare il proprio utente / gruppo da eseguire come. Di solito devi usare / tmp, / var / tmp o / var / run se vuoi che crei file - di solito non dovrebbe avere diritti altrove. Dato che non è in grado di segnalare errori a un terminale, dovresti farlo scrivere in un file di registro (ad es. È il proprio file di registro in / var / log). I demoni dovrebbero entrare in / var / run con il suo PID corrente e dovrebbero verificare se un'altra istanza di esso era già in esecuzione. Dovrebbe rispettare i blocchi (/ var / lock) per file o dispositivi ove applicabile. Dovrebbe rispondere a SIGHUP ricaricando i suoi file di configurazione e utilizzare le configurazioni aggiornate.

Un altro punto è come funziona la maggior parte dei demoni. Un demone è di solito un singolo eseguibile che può essere eseguito in una di due modalità distinte; a seconda che si tratti del demone originale - il genitore - avviato all'avvio o manualmente ... o di un figlio generato da questo genitore. Il processo genitore di solito si ferma e attende alcuni eventi: un tempo specifico, un tempo trascorso, un tentativo di connettersi a una porta di rete specifica o qualsiasi altra cosa. Quando ciò accade, il genitore crea un processo figlio identico a se stesso (usando il fork () chiamata di sistema) - e torna immediatamente in attesa di un altro evento (e forse sta generando più figli). È il processo figlio che svolgerà effettivamente il lavoro, ad esempio sincronizzare un disco, eseguire un comando (ad es. cron) O stabilire una connessione di rete (ad es. sshdOftpd). L'unica differenza tra genitore e figlio è che hanno PID diversi e che il PPID (Parent-PID) del figlio è il PID del processo genitore - questo può essere usato per determinare se il processo è il genitore o il figlio. Quindi lo stesso processo deve essere in grado di operare in due modi: come il genitore in attesa (e che genera) o come figlio che lavora.

Anche se non è difficile scrivere un demone, non è nemmeno banale - come vedi ci sono alcuni "trucchi" che devi conoscere per primi. In generale, penso che scrivere un demone richiederebbe un grande sforzo per un guadagno molto piccolo rispetto ad altre alternative:

L'uso nohupo disownsu un lavoro in background è di solito un'alternativa abbastanza valida, poiché mantiene in vita il processo anche se il terminale si chiude. Spesso è una buona idea reindirizzare stdout e stderr su un file o su / dev / null però. Per programmi più interattivi, screenè un buon modo per mettere qualcosa "via" fino a quando non ne hai bisogno. at, batche crontabvale anche la pena partecipare.


1
Inoltre ricordo dai miei vecchi corsi di sistema unix, che quando lanciato da un terminale il server deve anche lasciare il suo [gruppo di processo] [ en.wikipedia.org/wiki/Process_group] . Per quanto mi ricordo. In modo che il processo sia immune da qualsiasi segnale dal suo terminale originale.
yves Baumes,
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.