Cum să utilizați comanda nohup în Linux

Publicat: 2022-06-25
Laptop Linux afișează un prompt bash
fatmawati achmad zaenuri/Shutterstock.com

Comanda Linux nohup permite proceselor importante să continue să ruleze chiar și atunci când fereastra terminalului care le-a lansat este închisă. Vă arătăm cum să utilizați această comandă venerabilă pe Linux-ul de astăzi.

HUP și SGHUP

Unix, strămoșul Linux-ului, a fost creat înainte ca computerul să fie inventat. Calculatoarele erau echipamente mari și scumpe. Oamenii au interacționat cu ei prin linii seriale fie local în aceeași clădire, fie de la distanță prin conexiuni lente modem. Inițial, ei și-au tastat instrucțiunile pe teleimprimante care au fost înlocuite treptat cu terminale stupide.

Au fost numiți prosti pentru că puterea de procesare era în computerul la care ați fost conectat, nu în terminalul pe care ați tastat. Programele rulau pe computer – oriunde ar fi putut fi localizat – și nu pe dispozitivul de pe birou.

Dacă s-a întâmplat ceva care a întrerupt conexiunea dintre terminalul dvs. și computer, computerul a detectat căderea liniei și a trimis un semnal HUP sau de închidere la programele pe care le-ați rulat. Programele au încetat execuția când au primit semnalul.

Cum să omorâți o aplicație desktop sau un proces de fundal pe Linux
LEGATE Cum să omorâți o aplicație desktop sau un proces de fundal pe Linux

Această funcționalitate trăiește în Linux astăzi. Pe computerul dvs., o fereastră de terminal este o emulare a unui terminal fizic. Dacă aveți procese care rulează care au fost lansate din acea fereastră de terminal și închideți acea fereastră, semnalul SIGHUP este trimis către programe, astfel încât acestea să fie informate despre HUP și să știe că ar trebui să se termine.

Există un efect de cascadă care are loc. Dacă procesele au lansat procese secundare, SIGHUP este transmis și acestora, astfel încât să știe că ar trebui să se încheie.

Comanda nohup lansează procesele copil, dar refuză să le transmită semnale SIGHUP . Ar putea suna ca o problemă, dar este de fapt o funcție utilă.

Comanda nohup

Dacă doriți ca un proces să continue chiar dacă fereastra terminalului din care a fost lansat este închisă, aveți nevoie de o modalitate de a intercepta SIGHUP , astfel încât programul să nu-l primească niciodată. (De fapt, fereastra terminalului nu lansează procese, acestea sunt lansate de sesiunea shell din interiorul ferestrei terminalului.) Soluția simplă și elegantă la această problemă este să plasați un alt proces între sesiunea shell și program și să aveți asta programul de nivel mediu nu transmite niciodată semnalul SIGHUP .

Asta face nohup . Lansează programe pentru dvs., astfel încât acestea să fie un proces copil al nohup , nu un proces copil al shell-ului. Deoarece nu sunt un proces copil al shell-ului, nu vor primi direct un SIGHUP de la shell. Și dacă nohup nu transmite SIGHUP copiilor săi, programul nu va primi SIGHUP deloc.

Acest lucru este util atunci când, de exemplu, aveți un proces de lungă durată pe care trebuie să îl lăsați să ruleze până la finalizare. Dacă închideți accidental fereastra terminalului și shell-ul acesteia, veți încheia și procesul. Utilizarea nohup pentru a lansa procesul izolează procesul de semnalul nohup . Dacă lucrați de la distanță pe un computer prin SSH și nu doriți ca un proces sensibil să se încheie dacă conexiunea la distanță eșuează, veți începe procesul pe computerul de la distanță cu nohup .

Folosind nohup

Am creat un program care nu face nimic util, dar va rula și va rula până când este terminat. Tipărește ora în fereastra terminalului la fiecare trei secunde. Se numește long-proc pentru „proces lung”.

 ./lung-proc 

Programul cu proces lung care rulează o fereastră de terminal

Dacă acesta a fost un program care a făcut ceva util și am vrut să continue să ruleze chiar dacă fereastra terminalului și shell-ul sunt închise, l-am lansa cu nohup .

 nohup ./long-proc 

lansarea programului long-proc de la nohup

Procesul este decuplat de stdin și stdout , astfel încât să nu poată primi nicio intrare și nici să scrie în fereastra terminalului. De asemenea, pentru că încă rulează, nu revii la promptul de comandă. Tot ceea ce face nohup este să facă procesul impermeabil la închiderea terminalului. Nu transformă procesul într-o sarcină de fundal.

Acum trebuie să reporniți doar pentru a încheia procesul? Nu. Pentru a opri un proces nohup pe care nu l-ați lansat ca proces de fundal, apăsați combinația de taste Ctrl+C.

Oprirea procesului de lungă durată cu Ctrl+C

Ieșirea din program a fost capturată pentru noi într-un fișier numit „nohup.out”. Îl putem revizui cu mai puțin.

 mai putin nohup.out 

Deschiderea fișierului nohup.out în mai puțin

Orice lucru care ar fi de obicei trimis în fereastra terminalului este capturat în fișier. Execuțiile ulterioare ale nohup vor fi atașate la fișierul existent „nohup.out”.

Ieșirea din long-proc scrisă în fișierul nohup.out, afișată în mai puțin

O modalitate mai utilă de a rula procesul este să-l lansați cu nohup , astfel încât să reziste la închiderea ferestrei terminalului și să faceți din acesta o sarcină de fundal în același timp. Pentru a face acest lucru, adăugăm un ampersand „ & ” la sfârșitul liniei de comandă.

 nohup ./long-proc & 

lansarea programului lung-proc cu nohup și transformarea acestuia într-o sarcină de fundal

Va trebui să apăsați „Enter” încă o dată pentru a reveni la promptul de comandă. Ni se spune că numărul jobului al procesului este 1 — numărul dintre paranteze „ [] „ — și că ID-ul procesului este 13115.

Putem folosi oricare dintre acestea pentru a încheia procesul. „Ctrl+C” nu va funcționa acum, deoarece programul nu are nicio asociere nici cu fereastra terminalului, nici cu shell-ul.

Dacă uitați care este numărul jobului, puteți utiliza comanda jobs pentru a enumera sarcinile de fundal care au fost lansate din acea fereastră de terminal.

 locuri de munca 

Listarea sarcinilor de fundal care au fost lansate dintr-o fereastră de terminal

Pentru a ne ucide sarcina putem folosi comanda kill și numărul jobului, precedate de semnul procentual „ % ”, astfel:

 ucide %1

Dacă ați închis fereastra terminalului, va trebui să găsiți ID-ul procesului și să îl utilizați cu comanda kill . Comanda pgrep va găsi ID-ul procesului pentru procesele care se potrivesc cu indiciul de căutare pe care îl furnizați. Vom căuta numele procesului.

 pgrep lung-proc 

Găsirea ID-ului de proces al unui proces după nume

Acum putem folosi ID-ul procesului pentru a încheia procesul.

 ucide 13115 

Folosind comanda kill și ID-ul procesului pentru a încheia un proces

Data viitoare când apăsați „Enter” veți fi informat că procesul a fost încheiat.

Acum să ne uităm la ce nu încheie procesul. Îl vom relansa și apoi închidem fereastra terminalului.

 nohup ./long-proc 

Închiderea ferestrei terminalului cu un proces care rulează

Dacă deschidem o nouă fereastră de terminal și căutăm procesul nostru cu pgrep , vedem că încă rulează. Închiderea ferestrei terminalului care a lansat procesul nu a avut niciun efect.

 pgrep lung-proc 

Folosind pgrep pentru a căuta un proces după nume

Este posibil să transmiteți mai multe comenzi către nohup , dar de obicei este mai bine să le lansați separat. Este mai ușor să le manipulați ca lucrări de fundal. Comenzile nu vor rula în același timp, vor fi executate una după alta. Execuția nu este concurentă, este secvențială. Pentru ca acestea să ruleze simultan, trebuie să le lansați separat.

Acestea fiind spuse, pentru a lansa mai multe procese simultan, utilizați nohup pentru a lansa un shell Bash și utilizați opțiunea -c (comenzi) cu șirul de comenzi. Folosiți ghilimele simple „ ' ” pentru a încheia lista de comenzi și ghilimele duble „ && ” pentru a separa comenzile.

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

Lansarea a două procese cu nohup

Dacă folosiți less pentru a căuta prin fișierul „nohup.out”, veți vedea rezultatul din primul proces, apoi rezultatul celui de-al doilea proces.

 mai putin nohup.out 

Deschiderea fișierului nohup.out în mai puțin

Ieșirea de la ambele comenzi a fost capturată în fișierul „nohup.out”. Nu este împletit, ieșirea celui de-al doilea proces începe doar odată ce primul proces s-a încheiat.

Conținutul fișierului nohup.out în mai puțin

Dacă doriți să utilizați un fișier propriu în loc de „nohup.out”, puteți redirecționa comanda în fișierul dorit.

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

redirecționarea rezultatelor din procese către un fișier furnizat de utilizator

Rețineți că mesajul nu mai spune „adăugarea ieșirii la nohupo.out”, spune „redirecționarea stderr la stdout” și redirecționăm stdout către fișierul nostru „myfile.txt”.

Putem căuta în interiorul fișierului „myfile.txt” cu mai puțin.

 mai puțin fișierul meu.txt 

Ca și înainte, conține rezultatul ambelor comenzi.


Este amuzant cum istoria unei utilități poate uneori să o facă să pară că nu are nicio relevanță pentru vremurile moderne. Comanda nohup este una dintre acestea. Ceva care a fost creat pentru a face față deconectărilor pe liniile seriale este încă util pentru utilizatorii Linux de astăzi pe mașini incredibil de puternice.

LEGATE: 37 de comenzi Linux importante pe care ar trebui să le cunoașteți