Come utilizzare il comando nohup in Linux

Di Redazione FinanzaNews24 10 minuti di lettura
come-utilizzare-il-comando-nohup-in-linux
Come utilizzare il comando nohup in Linux

Il comando Linux nohup consente ai processi importanti di continuare a essere eseguiti anche quando la finestra del terminale che li ha avviati è chiusa. Ti mostriamo come utilizzare questo venerabile comando sul Linux di oggi.

HUP e SIGHUP

Unix, l’antenato di Linux, è stato creato prima dell’invenzione del PC. I computer erano apparecchiature grandi e costose. Le persone interagivano con loro tramite linee seriali localmente all’interno dello stesso edificio o in remoto tramite connessioni modem lente. Inizialmente, hanno digitato le loro istruzioni su telescriventi che furono gradualmente sostituite da terminali muti.

Erano definiti stupidi perché la potenza di elaborazione era nel computer a cui eri connesso, non nel terminale su cui stavi digitando. I programmi erano in esecuzione sul computer, ovunque si trovasse, e non sul dispositivo sulla scrivania.

Se è successo qualcosa che ha interrotto la connessione tra il terminale e il computer, il computer ha rilevato la caduta della linea e ha inviato un messaggio HUP o riagganciare il segnale ai programmi che stavi eseguendo. I programmi hanno cessato l’esecuzione quando hanno ricevuto il segnale.

Quella funzionalità sopravvive in Linux oggi. Sul tuo PC, a finestra del terminale è un’emulazione di un terminale fisico. Se sono in esecuzione processi avviati da quella finestra di terminale e chiudi quella finestra, il file SIGHUP

il segnale viene inviato ai programmi in modo che siano informati dell’HUP e sappiano che dovrebbero terminare.

C’è un effetto a cascata che avviene. Se i processi hanno avviato processi figli, il SIGHUP viene passato anche a loro in modo che sappiano che dovrebbero terminare.

IL nohup Il comando avvia i processi figli ma rifiuta di passare loro i segnali SIGHUP. Potrebbe sembrare un problema, ma in realtà è una funzione utile.

Il comando nohup

Se vuoi che un processo continui anche se la finestra del terminale da cui è stato avviato è chiusa, hai bisogno di un modo per intercettare SIGHUP in modo che il programma non lo riceva mai. (In realtà, la finestra del terminale non avvia i processi, vengono avviati dalla sessione della shell all’interno della finestra del terminale.) La soluzione semplice ed elegante a questo problema è posizionare un altro processo tra la sessione della shell e il programma, e farlo il programma di livello intermedio non trasmette mai il segnale SIGHUP.

Questo è ciò che nohup fa. Lancia i programmi per te in modo che siano un processo figlio di nohup, non un processo figlio della shell. Poiché non sono un processo figlio della shell, non riceveranno direttamente un SIGHUP dalla shell. E se nohup non trasmette il SIGHUP ai suoi figli, il programma non riceverà affatto il SIGHUP.

Ciò è utile quando, ad esempio, si ha un processo di lunga durata che è necessario attendere fino al completamento. Se chiudi accidentalmente la finestra del terminale e la sua shell, terminerai anche il processo. Utilizzando nohup per avviare il processo isola il processo da nohup segnale. Se lavori in remoto su un computer tramite SSH e non vuoi che un processo sensibile venga terminato se la connessione remota fallisce, dovresti avviare il processo sul computer remoto con nohup .

Usando nohup

Abbiamo creato un programma che non fa nulla di utile, ma funzionerà e funzionerà finché non verrà terminato. Stampa l’ora nella finestra del terminale ogni tre secondi. Si chiama long-proc per “processo lungo”.

./long-proc Se questo fosse un programma che fa qualcosa di utile e volessimo che continuasse a funzionare anche se la finestra del terminale e la shell sono chiuse, lo avvieremmo con nohup.

nohup ./long-proc Il processo è disaccoppiato da stdin E stdout quindi non può né ricevere alcun input né scrivere nella finestra del terminale. Inoltre, poiché è ancora in esecuzione, non vieni riportato al prompt dei comandi. Tutto quello nohup non fa altro che rendere il processo impermeabile alla chiusura del terminale. Non è così trasformare il processo in un’attività in background.

Adesso devi farlo? riavviare solo per terminare il processo? No. Per fermare a nohup processo che non hai avviato come processo in background, premi la combinazione di tasti Ctrl+C.

L’output del programma è stato catturato per noi in un file chiamato “nohup.out”. Possiamo rivederlo con meno.

less nohup.out Tutto ciò che normalmente verrebbe inviato alla finestra del terminale viene catturato nel file. Esecuzioni successive di nohup verrà aggiunto al file “nohup.out” esistente.

Un modo più utile per eseguire il processo è avviarlo con nohup in modo che resista alla chiusura della finestra del terminale e per renderlo a compito in background allo stesso tempo. Per fare questo aggiungiamo una e commerciale “&” alla fine della riga di comando.

nohup ./long-proc & Dovrai premere nuovamente “Invio” per tornare al prompt dei comandi. Ci è stato detto che il numero di lavoro del processo è 1—il numero tra parentesi “[]”— e che l’ID del processo è 13115.

Possiamo utilizzare uno di questi per terminare il processo. “Ctrl+C” non funzionerà ora perché il programma non ha alcuna associazione né con la finestra del terminale né con la shell.

Se dimentichi qual è il numero del lavoro, puoi utilizzare il file jobs comando per elencare le attività in background che sono state avviate da quella finestra del terminale.

jobs Per terminare il nostro compito possiamo usare il file kill comando e il numero di lavoro, preceduto dal segno di percentuale “%”, come questo:

kill %1 Se hai chiuso la finestra del terminale dovrai trovare l’ID del processo e utilizzarlo con il file kill comando. IL pgrep Il comando troverà l’ID del processo per i processi che corrispondono all’indizio di ricerca fornito. Cercheremo il nome del processo.

pgrep long-proc Ora possiamo utilizzare l’ID del processo per terminare il processo.

kill 13115 La prossima volta che premi “Invio” verrai informato che il processo è stato terminato.

Ora diamo un’occhiata a cosa non termina il processo. Lo rilanceremo e quindi chiuderemo la finestra del terminale.

nohup ./long-proc Se apriamo una nuova finestra di terminale e cerchiamo il nostro processo con pgrep, vediamo che è ancora in esecuzione. La chiusura della finestra del terminale che ha avviato il processo non ha avuto alcun effetto.

pgrep long-proc È possibile passare più comandi a nohup, ma in genere è meglio avviarli separatamente. Rende più semplice manipolarli come lavori in background. I comandi non verranno eseguiti contemporaneamente, verranno eseguiti uno dopo l’altro. L’esecuzione non è simultanea, è sequenziale. Per farli funzionare contemporaneamente è necessario avviarli separatamente.

Detto questo, a avviare più processi contemporaneamenteutilizzo nohup per avviare una shell Bash e utilizzare il file -c (comandi) opzione con la stringa di comandi. Utilizza virgolette singole “‘” per racchiudere l’elenco dei comandi e raddoppiare la e commerciale “&&” per separare i comandi.

nohup bash -c ‘ls /bin && ls /sbin’ Se tu utilizzo less per esaminare il file “nohup.out”, vedrai l’output del primo processo, quindi l’output del secondo processo.

less nohup.out L’output di entrambi i comandi è stato catturato nel file “nohup.out”. Non è intrecciato, l’output del secondo processo inizia solo una volta terminato il primo processo.

Se vuoi usare un tuo file invece di “nohup.out”, puoi farlo reindirizzare il comando nel file di tua scelta.

nohup bash -c ‘ls /bin && ls /sbin’ > myfile.txt Tieni presente che il messaggio non dice più “aggiungere output a nohupo.out”, dice “reindirizzamento stderr a stdout” e stiamo reindirizzando stdout al nostro file “myfile.txt”.

Possiamo guardare all’interno del file “myfile.txt” con less.

less myfile.txt Come prima, contiene l’output di entrambi i comandi.

È curioso come la storia di un servizio di pubblica utilità a volte possa far sembrare che non abbia alcuna rilevanza per i tempi moderni. IL nohup comando è uno di quelli. Qualcosa che è stato creato per far fronte alle disconnessioni sulle linee seriali è ancora utile agli utenti Linux di oggi su macchine incredibilmente potenti.

Condividi questo articolo
Exit mobile version