Differenze tra "<comando> e rinnega" e "nohup <comando> e rinnega"


41

Questa è la mia comprensione circa l'uso di &, disowne nohup:

  • <command>: esegue il processo all'interno bashdell'istanza corrente del Terminale , in primo piano (ovvero il processo è elencato come bashlavoro in primo piano e stdin, stdoute stderrsono ancora associati al terminale ); non immune ai problemi ;
  • <command> &: esegue il processo bashnell'istanza corrente del Terminale , in background (ovvero il processo è elencato come bashprocesso in background e stdin, stdoute stderrsono ancora associati al terminale ); non immune ai problemi ;
  • <command> & disown: esegue il processo bashnell'istanza corrente del Terminale , in background , ma il processo è staccato dalla bashlista dei 'lavori' (cioè il processo non è elencato come bashlavoro in primo piano / in background e stdin, stdoute stderrsono ancora legati al terminale ); immune ai problemi ;
  • nohup <command> & disown: Esegue il processo all'interno corrente del Terminal bashesempio, sullo sfondo , ma il processo è staccato dalle bashlista 's lavori' (vale a dire il processo non è elencato come un bash/ processo in background primo piano e stdin, stdoute stderrsono non ancora legato al terminale ) ; immune ai problemi ;

Quindi, a parte il nohup <command> & disownblocco stdine il reindirizzamento stdoute stderrper nohup.outimpostazione predefinita, mi sembra che possa essere considerato totalmente equivalente a <command> & disown.

Quanto sopra è corretto? Qualche idea sbagliata?


1
Che cosa intendi con "immune ai problemi" e "non immune ai problemi"?
caos,

2
@chaos Voglio dire che terminare / uccidere l' bashistanza padre non ucciderà il processo
kos

Risposte:


32

La tua comprensione è sostanzialmente corretta. Entrambi disowne nohupvengono utilizzati per consentire di uscire da una sessione di shell in esecuzione senza interrompere i processi in esecuzione. Alcuni chiarimenti:

  • Non c'è motivo di scappare nohup command & disown, nohuplo rinnegherai già per te.

  • nohupè definito da POSIX mentre disown non lo è . Ciò significa che mentre molte conchiglie (ad esempio bash, zsh, ksh) hanno, altri (ad esempio tcsh, csh, dashe sh) non hanno.

  • disownpuò essere usato dopo che un comando è stato lanciato mentre nohupdeve essere usato prima.

Per quanto ne so, l'effetto reale dei due comandi è lo stesso. Ognuno di essi ha caratteristiche che all'altro manca (vedi help disowne man nohup) ma la loro funzione di base è la stessa, sì.

Per una discussione molto più dettagliata di questi strumenti e delle differenze tra loro, dai un'occhiata alle risposte qui:


11
Nohupe disownnon sono la stessa cosa e l'utilizzo di entrambi i comandi insieme NON è ridondante. Vedi questa risposta per una descrizione approfondita
promemoria

7

I tuoi punti dal primo al terzo sembrano a posto, anche se stdin, stdout and stderr are still bound to the terminalnon è una nozione giusta. stdinè sempre associato al terminale, nel senso che si dovrebbe sempre inserire il nome del file in un comando tramite terminale o in un modo usando terminale. stdout and stderr are still bound to the terminalva bene

Hai stdin, stdout and stderr are not still bound to the terminalnel quarto punto che non è giusto come indicato nel mio paragrafo precedente. Anche qui stai usando /dev/nullcome file di input per command, ad esempio se il comando è cat, lo stai usando come cat /dev/null.

Il comando sul 5 ° punto non è stato inserito correttamente, è stato utilizzato nohup <command> & disown, mentre non è necessario utilizzare uno nohupo disownl'altro. I loro scopi sono gli stessi (ignorarli SIGHUP) ma funzionano in modo leggermente diverso. Quindi il comando può essere semplificato come nohup <command> &.

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.