Entrambi nohup myprocess.out &
o myprocess.out &
impostare myprocess.out per l'esecuzione in background. Dopo aver spento il terminale, il processo è ancora in esecuzione. Qual è la differenza tra loro?Qual è la differenza tra nohup ed e commerciale
risposta
nohup
cattura il segnale hangup (vedi man 7 signal
) mentre la commerciale non (tranne il serbatoio è confgured questo modo o non invia SIGHUP
affatto).
In genere, quando si esegue un comando utilizzando &
e si esce dalla shell in seguito, la shell interromperà il sottocomando con il segnale di disconnessione (kill -SIGHUP <pid>
). Questo può essere evitato usando nohup
, poiché cattura il segnale e lo ignora in modo che non raggiunga mai l'applicazione effettiva.
Nel caso in cui si stia utilizzando bash, è possibile utilizzare il comando shopt | grep hupon
per scoprire se la shell invia SIGHUP ai suoi processi figli o meno. Se è spento, i processi non saranno risolti , come sembra essere il tuo caso. Ulteriori informazioni su come bash termina le applicazioni possono essere trovate here.
ci sono casi in cui nohup
non funziona, per esempio quando il processo si avvia riconnette il segnale SIGHUP
, come è il caso here.
myprocess.out &
eseguirà il processo in background utilizzando una subshell. Se la shell corrente viene terminata (ad esempio in uscita dal logout), anche tutte le subshell vengono terminate, quindi anche il processo in background verrebbe chiuso. Il comando nohup ignora il segnale HUP
e quindi anche se la shell corrente è terminata, la subshell e il file myprocess.out continueranno a funzionare in background. Un'altra differenza è che il solo &
non reindirizza lo stdout/stderr, quindi se ci sono output o errori, questi vengono visualizzati sul terminale. nohup d'altra parte reindirizza lo stdout/stderr su nohup.out o $ HOME/nohup.out.
Eseguo 'myprocess.out &' e esco dalla shell. Tuttavia, quando uso 'ps aux | grep myprocess.out' nell'altra shell, posso ancora trovare "myprocess.out". Significa che il processo è ancora in esecuzione, non può essere terminato. – Yarkee
@amit_g Quando si uccide la shell madre con 'kill -9' non ci sarà un SIGHUP in quanto ciò richiederebbe alla shell madre di gestire SIGKILL, che non può. – nemo
Controlla shopt | grep hupon come menzionato nell'altra risposta. –
L'utilizzo della e commerciale (&) eseguirà il comando in un processo figlio (secondario alla sessione di bash corrente). Tuttavia, quando si esce dalla sessione, tutti i processi figli verranno uccisi.
utilizzando nohup + e commerciale (&) farà la stessa cosa, tranne che al termine della sessione, il genitore del processo figlio verrà modificato in "1" che è il processo "init", preservando così il bambino da essere ucciso.
La maggior parte delle volte effettuiamo il login al server remoto usando ssh. Se si avvia uno script di shell e si esegue il logout, il processo viene interrotto. Nohup consente di continuare a eseguire lo script in background anche dopo aver effettuato il logout dalla shell.
Nohup command name &
eg: nohup sh script.sh &
Nohup rileva i segnali HUP. Nohup non inserisce automaticamente il lavoro in background. Dobbiamo dire che l'uso esplicito di &
Grazie. Non mi aspettavo la tua risposta, ma il fatto che sia qui è fantastico. Risponde alla domanda che non ho posto: D –
Il comando nohup è un'utilità di mascheramento del segnale e rileva il segnale di disconnessione. Dove come e commerciale non cattura i segnali di blocco. La shell terminerà il comando secondario con il segnale di blocco quando si esegue un comando usando & e uscendo dalla shell. Questo può essere evitato usando nohup, mentre prende il segnale. Il comando Nohup accetta il segnale di sospensione che può essere inviato ad un processo dal kernel e bloccarlo.Il comando Nohup è utile quando un utente desidera avviare l'esecuzione prolungata della sessione o chiudere la finestra in cui è stato avviato il processo. Una di queste azioni normalmente richiede al kernel di riagganciare all'applicazione, ma un wrapper nohup consentirà al processo di continuare. L'utilizzo della e commerciale eseguirà il comando in un processo figlio e questo figlio della sessione bash corrente. Quando esci dalla sessione, tutti i processi figli di quel processo verranno uccisi. La e commerciale si riferisce al controllo del lavoro per la shell attiva. Questo è utile per eseguire un processo in una sessione in background.
Correggetemi se sbaglio
nohup myprocess.out &
nohup catture il segnale di hangup, che significa che invierà un processo quando il terminale chiuso.
myprocess.out &
Il processo può essere eseguito ma si interromperà una volta chiuso il terminale.
nohup myprocess.out
processo in grado di funzionare anche terminale chiuso, ma si è in grado di arrestare il processo premendo ctrl
+ z
nel terminale. Crt
+ z
non funziona se &
è già esistente.
quale shell stai usando? il comportamento varia tra le shell – shx2
bash. E so perché ora secondo la risposta di @nemo. – Yarkee
@Yarkee se la risposta è adatta al tuo problema, contrassegnare la domanda come accettata (la casella di controllo sotto i voti della risposta) in modo che non rimanga senza risposta. Dovresti farlo per tutte le tue domande :) – nemo