2009-06-05 6 views

risposta

64

Il comando nohup è il modo di eseguire un processo come un demone. Come ha notato Bruno Ranschaert, quando si esegue un comando in una shell interattiva, ha un terminale di controllo e riceverà un segnale SIGHUP (hangup) quando il processo di controllo (tipicamente la shell di accesso) viene chiuso. Il comando nohup dispone che l'input provenga da /dev/null e che sia per l'output sia per gli errori venga inviato a nohup.out e che il programma ignori gli interrupt, i segnali di chiusura e le interruzioni. In realtà ha ancora lo stesso terminale di controllo - ignora semplicemente i controlli dei terminali. Si noti che se si desidera eseguire il processo in background, è necessario indicare alla shell di eseguirlo in background, almeno su Solaris (ovvero, si digita "nohup sleep 20 &"; senza la "e commerciale", il processo viene eseguito in modo sincrono nel primo piano).

In genere, un processo eseguito tramite nohup è qualcosa che richiede tempo, ma che non rimane in attesa di interazione da altrove.

genere (il che significa che se si prova difficile, si possono trovare eccezioni a queste regole), un processo demone è qualcosa che si nasconde in background, scollegato da qualsiasi terminale, ma in attesa di rispondere a qualche input di qualche tipo. I demoni di rete attendono che le richieste di connessione o i messaggi UDP arrivino sulla rete, eseguono il lavoro appropriato e inviano di nuovo una risposta. Pensa ad esempio ad un server web o ad un DBMS.

Quando un processo si demone completamente, passa attraverso alcuni dei passaggi che attraversano il codice nohup; riorganizza il proprio I/O in modo che non sia collegato a nessun terminale, si stacchi dal gruppo di processi, ignora i segnali appropriati (il che potrebbe significare che non ignora alcun segnale, poiché non vi è alcun terminale per inviarlo nessuno dei segnali generati tramite un terminale). In genere, si forca una volta e il genitore esce correttamente. Il processo figlio di solito si biforca una seconda volta, dopo aver risolto il suo gruppo di processi e l'ID di sessione e così via; anche il bambino esce. Il processo del nipote è ora autonomo e non verrà visualizzato nell'output ps per il terminale in cui è stato avviato.

Puoi guardare Advanced Programming in the Unix Environment, 3rd Edn di W Richard Stevens e Stephen A Rago, oppure allo Advanced Unix Programming, 2nd Edn di Marc J Rochkind per le discussioni sulla demonizzazione.

Ho un programma daemonize che eseguirà il demone da un programma che non sa come eseguire il daemonize (correttamente). È stato scritto per aggirare i difetti di un programma che avrebbe dovuto demonizzarsi, ma non ha svolto correttamente il lavoro. Contattami se lo vuoi - guarda il mio profilo.

+11

Non so perché lo chiami povero. Fa la cosa giusta se vuoi che il tuo processo diventi un demone, a parte il fatto che non si disconnette dal terminale di controllo, che in pratica non ha importanza. In secondo luogo, la stai chiamando erroneamente, la forma corretta è '(nohup sleep 20 &)', cioè paren la scollega dal leader del gruppo di processi, in modo che non riceva segnali per quel gruppo di processi. –

+0

@MaximYegorushkin I paren non fanno alcuna differenza (per quanto posso vedere). L'esecuzione di qualsiasi programma da una shell lo rende sempre un leader di gruppo. Prova questo e vedrai che il PGID corrisponde sempre al PID: 'perl -e 'system" ps -fjp $$ "''. Inoltre, la e commerciale non è inerente a nohup, quindi anche quella è una differenza tra nohup e daemon. Aggiungerò la mia risposta con ancora più diff. – Kelvin

+4

@Kelvin: le parentesi in '(nohup sleep 20 &)' fanno la differenza. Specificano una sub-shell. All'interno della sub-shell, il comando 'nohup' esegue il comando' sleep' in background. Quando ritorna, la sub-shell termina, quindi 'sleep' è orfano, non più 'posseduto' dalla shell corrente. –

6

Nelle varianti UNIX, un processo è associato a un processo terminale (shell di accesso). Quindi, quando il processo terminale termina, il processo viene fermato, a causa di questa associazione. Il nohup impedisce ad un processo di uscire quando il terminale si ferma.

Un daemon o demone è un processo che viene avviato dal sistema all'avvio, viene eseguito fino allo spegnimento, nessun utente lo richiede esplicitamente. Quindi per definizione non fa parte dell'interazione dell'utente ma appartiene al sistema.

Se si ha accesso al sistema come utente, è possibile utilizzare nohup. Se sei amministratore di sistema, puoi installare un processo di deamon. Per il processo non ha importanza.

+0

+1 Sono corretto. Misto tra demone e un processo in background (&). :) – pugmarx

+1

Quasi a destra. Quando un processo di controllo (capogruppo) esce da tutti i processi nel gruppo, viene inviato SIGHUP seguito opzionalmente da SIGCONT. –

+5

Alcune correzioni: un demone non ha bisogno di essere un processo di sistema; un utente non privilegiato può eseguire un demone. Un utente può interagire con un daemon, ma non tramite segnali terminali e flussi IO (si pensi al web server). I demoni possono essere avviati quasi in qualsiasi momento; non sono limitati al boot del sistema. – Kelvin

-1

Un daemon non può essere avviato, mentre nohup viene avviato dall'utente.

36

diventare un demone

Questo collegamento ha una buona lista di passi di un processo dovrebbe prendere a diventare un demone: http://www.steve.org.uk/Reference/Unix/faq_2.html#SEC16

non riesco a copiare l'elenco pari pari quanto del diritto d'autore (vedi a proposito di sezione), ma ecco il riassunto:

  1. fork (prima volta) - quindi non siamo un leader del gruppo, e lasciamo l'uscita genitore.
  2. chiamata setsid() - per diventare il leader di una nuova sessione. Questa chiamata funziona solo se non siamo un capogruppo. Questa nuova sessione non ha un terminale di controllo.
  3. fork (seconda volta) - quindi non sono un leader di sessione (e quindi non può riconquistare un terminale di controllo), e lasciare che l'uscita genitore.
  4. cd nella directory radice - in modo da non impedire che altre directory vengano smontate.
  5. set umask al valore desiderato (facoltativo) - perché potremmo aver ereditato una maschera che non volevamo.
  6. chiudere stdin, stdout, stderr (o semplicemente riaprire loro di puntare altrove)

nohup

Nei nohup significa:

  • Se stdout e stderr sono collegati ad un terminale , li reindirizza a nohup.out
  • ignora SIGHUP

analogie e differenze

Notate come le uniche azioni comuni stiamo reindirizzando stdout e stderr. Per essere un daemon non è nemmeno necessario ignorare SIGHUP.

nohup non richiede l'utilizzo di "&" per lo sfondo del processo, ovvero è possibile utilizzare ancora ctrl-c per inviare SIGINT. Il processo risponde ancora all'input della tastiera. Inoltre, non cambia automaticamente stdin, quindi si consiglia di farlo da soli tramite "< /dev/null".

Si prega di non confondere nohup con altre funzioni normalmente utilizzate con esso (ad esempio backgrounding). L'OP ha chiesto in particolare su nohup.

In pratica

In termini di praticità, quando si vuole avviare un processo di una volta a lungo in esecuzione, che dovrebbe continuare quando le uscite di shell, ti consigliamo di utilizzare nohup, ma dovrete voglio anche combinarlo con lo sfondo e il reindirizzamento dello stdin.Un singolo lavoro non vale la pena fare un demone, ma alcune delle proprietà di un demone possono ancora essere utili con un lavoro noh, come "cd /".

compiti periodici a intervalli regolari sono meglio eseguiti tramite cron (o qualche altro scheduler).

Demoni sono più adatti per supervisionare le attività ripetute che non hanno un orario di inizio prevedibile. Normalmente non esiste un tempo finale definitivo per il processo daemon (viene fermato esplicitamente da un utente/da un altro processo o dall'arresto del sistema). Spesso i daemon sono servizi che rispondono alle applicazioni (client) o ad altre condizioni (ad esempio, dati in entrata tramite un dispositivo IO tramite unix select()). Altri demoni sondano una condizione ed eseguono un'azione in risposta.

addendum sul controllo terminale

Vedere this page. Un rapido riassunto è che un terminale di controllo garantisce accesso illimitato al suo stdin, stdout, stderr. Solo un gruppo di processi può avere accesso a stdin. Per impostazione predefinita, i gruppi di processi in background possono anche scrivere su stdout e stderr.

Inoltre, sembra che i segnali di tastiera inviati ad un terminale vengono inviati solo al gruppo procedimento che ha come terminale di controllo.

+0

Il tuo link steve.org.uk è rotto. – QED