Come usare il comando nohup in Linux

Come usare il comando nohup in Linux

Il comando Linux nohupconsente ai processi importanti di continuare a essere eseguiti anche se la finestra del terminale che li ha avviati è chiusa. Ti mostreremo come usare questo venerabile comando su Linux moderno.

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 su linee seriali, sia localmente all’interno dello stesso edificio che in remoto tramite connessioni modem lente. Inizialmente, hanno stampato le loro istruzioni su telescriventi, che sono state gradualmente sostituite da terminali contundenti.

Erano chiamati stupidi perché la potenza di elaborazione era nel computer a cui eri collegato, non nel terminale su cui stavi digitando. I programmi venivano eseguiti sul computer, ovunque si trovasse, non sul dispositivo sulla scrivania.

Se è successo qualcosa che ha interrotto la connessione tra il terminale e il computer, il computer ha rilevato un’interruzione di linea e ha inviato HUPo riattaccato un segnale ai programmi in esecuzione. I programmi hanno interrotto l’esecuzione quando hanno ricevuto un segnale.

Questa funzionalità sopravvive in Linux oggi. La finestra del terminale sul PC è un’emulazione di un terminale fisico. Se hai processi in esecuzione che sono stati avviati da questa finestra del terminale e chiudi questa finestra, SIGHUPviene inviato un segnale ai programmi in modo che siano informati HUPe sappiano che dovrebbero uscire.

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

Il comando nohupavvia i processi figlio, ma si rifiuta di SIGHUPsegnalarli. Questo può sembrare un problema, ma in realtà è una funzione utile.

comando noup

Se si desidera che un processo continui anche se la finestra del terminale da cui è stato avviato è chiusa, è necessario un modo per intercettarlo in SIGHUPmodo che il programma non lo ottenga mai. (La finestra del terminale in realtà non avvia i processi, vengono avviati da una sessione della shell all’interno della finestra del terminale.) Una soluzione semplice ed elegante a questo problema è inserire un altro processo tra la sessione della shell e il programma e avere il programma middleware non SIGHUPsegnalare mai.

Questo è quello nohupche fa. Esegue programmi affinché tu sia processi figlio nohup, non processi figlio della shell. Poiché non sono processi figlio della shell, non riceveranno direttamente SIGHUPdalla shell. E se nohupnon lo trasmette SIGHUPai suoi figli, il programma non lo riceverà affatto SIGHUP.

Ciò è utile quando, ad esempio, si dispone di un processo lungo che deve essere eseguito prima del completamento. Se chiudi accidentalmente la finestra del terminale e la sua shell, interromperai anche il processo. L’utilizzo nohupper avviare un processo isola il processo dal nohupsegnale. Se stai lavorando in remoto su un computer tramite SSH e non vuoi che un processo importante termini se la connessione remota fallisce, dovresti avviare il processo sul computer remoto con l’estensione nohup.

Usando nohup

Abbiamo creato un programma che non fa nulla di utile, ma funzionerà e funzionerà fino al termine. Stampa l’ora nella finestra del terminale ogni tre secondi. Questo è chiamato long-procil “processo lungo”.

./long-proc

Se fosse un programma che fa qualcosa di utile e vorremmo che continuasse a funzionare anche se la finestra del terminale e la shell sono chiuse, lo eseguiremmo con un file nohup.

nohup. /long-proc

Il processo è separato da esso stdin, stdout quindi non può né ricevere dati né scrivere nella finestra del terminale. Inoltre, poiché è ancora in esecuzione, non verrai restituito al prompt dei comandi. Tutto ciò che nohupdeve essere fatto è rendere il processo immune alla chiusura del terminale. Non trasforma il processo in un’attività in background.

Ora è necessario riavviare per completare il processo? No. Per interrompere nohupun processo che non è stato avviato come processo in background, premere la combinazione di tasti Ctrl+C.

L’output del programma è stato scritto per noi in un file chiamato “nohup.out”. Possiamo visionarlo a un costo inferiore.

less nohup.out

Tutto ciò che viene normalmente inviato a una finestra di terminale viene catturato in un file. Le nohupesecuzioni successive verranno aggiunte al file “nohup.out” esistente.

Un modo più utile per avviare un processo è avviarlo in nohupmodo tale che possa resistere alla chiusura della finestra del terminale e allo stesso tempo renderlo un’attività in background. Per fare ciò, aggiungiamo una e commerciale ” &” alla fine della riga di comando.

nohup. /long-proc &

Dovrai premere di nuovo “Invio” per tornare alla riga di comando. Ci viene detto che il numero del processo di processo è 1 (il numero tra parentesi ” []“) e che l’ID del processo è 13115.

Possiamo usarne uno qualsiasi per completare il processo. “Ctrl+C” non funziona ora perché il programma non ha alcuna connessione né con la finestra del terminale né con la shell.

Se hai dimenticato il numero del lavoro, puoi utilizzare jobsil comando per elencare le attività in background in esecuzione da questa finestra del terminale.

jobs

Per terminare la nostra attività, possiamo usare killil comando e il numero dell’attività preceduti da un segno di percentuale ” %“, in questo modo:

kill %1

Se hai chiuso la finestra del terminale, devi trovare l’id del processo e usarlo con killil comando. Il comando pgreptroverà l’ID processo per i processi che corrispondono alla chiave di ricerca immessa. Cercheremo il nome del processo.

pgrep long-proc

Ora possiamo utilizzare l’ID processo per terminare il processo.

kill 13115

La prossima volta che premi “Invio”, sarai informato che il processo è completo.

Ora vediamo cosa non termina il processo. Lo riavvieremo e quindi chiuderemo la finestra del terminale.

nohup. /long-proc

Se apriamo una nuova finestra di terminale e troviamo il nostro processo con pgrep, possiamo vedere che è ancora in esecuzione. La chiusura della finestra del terminale che ha avviato il processo non ha avuto alcun effetto.

pgrep long-proc

Puoi passare più comandi a nohup, ma in genere è meglio eseguirli singolarmente. Questo rende più facile manipolarli come lavori in background. I comandi non verranno eseguiti contemporaneamente, verranno eseguiti uno dopo l’altro. L’esecuzione non è parallela, è sequenziale. Affinché funzionino contemporaneamente, è necessario eseguirli separatamente.

Detto questo, per eseguire più processi contemporaneamente, utilizzare nohupuna shell Bash per avviare e utilizzare l’ -copzione (comandi) con la riga di comando. Usa le virgolette singole ” '” per racchiudere l’elenco dei comandi e le doppie e commerciali ” &&” per separare i comandi.

nohup bash -c 'ls /bin && ls /sbin'

Se lessvisualizzi il file “nohup.out”, vedrai l’output del primo processo e quindi l’output del secondo processo.

less nohup.out

L’output di entrambi i comandi è stato catturato nel file “nohup.out”. Questo non è intrecciato, l’output del secondo processo inizia solo dopo che il primo processo è stato completato.

Se desideri utilizzare il tuo file invece di “nohup.out”, puoi reindirizzare il comando a un file di tua scelta.

nohup bash -c 'ls /bin && ls /sbin' > myfile.txt

Nota che il messaggio non dice più “aggiunta di output a nohupo.out” ma piuttosto “reindirizzamento di stderr a stdout” e stiamo reindirizzando stdout al nostro file “myfile.txt”.

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

less myfile.txt

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

È divertente come la storia dell’utilità a volte possa dare l’impressione che non sia rilevante per il presente. La squadra nohupè una di queste. Qualcosa che è stato creato per gestire le interruzioni di linea seriali è ancora utile per gli utenti Linux di oggi su macchine incredibilmente potenti.

Lascia un commento

Il tuo indirizzo email non sarà pubblicato. I campi obbligatori sono contrassegnati *