Cum să utilizați comanda nohup în Linux

Configurare noua (How To)

Situatie

Comanda Linux nohup permite proceselor importante să continue să ruleze chiar și atunci când fereastra terminalului care le-a lansat este închisă.

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”.

./long-proc

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

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, deoarece încă rulează, nu veți reveni 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. Ieșirea din program a fost capturată pentru noi într-un fișier numit „nohup.out”. Îl putem revizui cu mai puțin.

less nohup.out

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”. 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 &

Va trebui să apăsați „Enter” încă o dată pentru a reveni la promptul de comandă. Ni se spune că numărul locului de muncă 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.

jobs

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

kill %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 long-proc

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

kill 13115

Data viitoare când apăsați „Enter”, sunteți informat că procesul a fost încheiat. Acum să ne uităm la ceea ce nu încheie procesul. Îl vom relansa și apoi închidem fereastra terminalului.

nohup ./long-proc

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 long-proc

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 concomitentă, 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 duble și „&&” pentru a separa comenzile.

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

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

less nohup.out

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.

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

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.

less myfile.txt

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

Solutie

Tip solutie

Permanent

Voteaza

(2 din 3 persoane apreciaza acest articol)

Despre Autor

Leave A Comment?