Cum să utilizați nohup pentru a executa comenzi în fundal și păstrați-l rulează după ce ieși dintr-o coajă de promt

cele Mai multe din timpul de conectare la server de la distanță prin ssh. Dacă porniți un script shell sau o comandă și ieșiți (anulați conexiunea la distanță), procesul/comanda va fi ucis. Uneori, un loc de muncă sau o comandă durează mult timp. Dacă nu sunteți sigur când se va termina lucrarea, atunci este mai bine să lăsați jobul să ruleze în fundal., Dar, dacă vă deconectați din sistem, lucrarea va fi oprită și terminată de shell-ul dvs. Ce faci pentru a păstra de locuri de muncă rulează în fundal atunci când procesul devine SIGHUP?în aceste situații, putem folosi nohup command line-utilitate care permite rularea command/process sau shell script care poate continua să ruleze în fundal după ce ne deconectăm de la un shell.

nohup este o comandă POSIX pentru a ignora semnalul Hup (hangup)., Semnalul HUP este, prin convenție, modul în care un terminal avertizează procesele dependente de deconectare.

ieșire care ar merge în mod normal la terminalul merge la un fișier numit nohup.out în cazul în care nu a fost deja redirecționat.

comanda nohup sintaxa:

sintaxa este următoarea

$ nohup command-name &$ exit

sau

$ nohup /path/to/command-name arg1 arg2 > myoutput.log &$ exit

în cazul în Care,

  • command-name: este numele de shell script sau un nume de comandă. Puteți trece argument pentru a comanda sau un script shell.,
  • &: nohup nu pune în mod automat comanda se execută în fundal; trebuie să faci asta în mod explicit, prin care se încheie la linia de comandă cu un & simbol.
  • exit: după nohup și & începe de comandă în fundal, va trebui în continuare să tastați exit sau CTRL-D pentru a merge înapoi la bash cursorul.,

Utilizarea locuri de muncă -l comandă pentru a lista toate locurile de muncă:

$ jobs -l

comanda nohup exemple

în Primul rând, de conectare la server de la distanță folosind ssh comanda:

$ ssh [email protected]

am de gând pentru a executa un script shell numit pullftp.sh:

$ nohup pullftp.sh &

Tastați exit sau apăsați CTRL + D pentru a ieși din server de la distanță:

> exit

În acest exemplu, am de gând pentru a găsi toate programe și script-uri cu setuid bit setat pe, introduceți:

$ nohup find / -xdev -type f -perm +u=s -print > out.txt &

Tastați exit sau apăsați CTRL + D pentru a ieși din server de la distanță., Locul de muncă încă mai continuă să fie difuzate după ce ieșiți.

> exit

nohup este adesea folosit în combinație cu comanda pentru a rula procese pe o prioritate mai mică.

rețineți că nohup nu Modifică prioritatea de planificare a comenzii; utilizați comanda nice în acest scop. De exemplu:

$ nohup nice -n -5 ls / > out.txt &

după Cum puteți vedea nohup păstrați rulează după ce ieși dintr-o coajă. Citiți pagina man de nohup (1) și Nisa(1) Pentru mai multe informații. Rețineți că nohup este aproape disponibil pe variantele Solaris/BSD / Linux / Unix.,

care este diferența între nohup și ampersand (&)

Ambele nohup myprocess.out & sau myprocess.out & set myprocess.afară pentru a rula în fundal. După ce am oprit terminalul, procesul este încă în desfășurare. Care este diferența dintre ele?

nohup prinde hangup semnal (vezi man 7 signal), în timp ce ampersand nu (cu excepția shell-ul este confgured așa sau nu trimite SIGHUP la toate).,

în mod Normal, atunci când execută o comandă folosind & și ieșirea din coajă după aceea, shell-ul va termina sub-comandă cu închidere semnal (kill -SIGHUP <pid>). Acest lucru poate fi prevenit folosind nohup, deoarece captează semnalul și îl ignoră astfel încât să nu ajungă niciodată la aplicația reală.

În cazul în care utilizați bash, puteți utiliza comanda shopt | grep hupon pentru a afla dacă shell-ul dvs. trimite SIGHUP la procesele sale copil sau nu. Dacă este oprit, procesele nu vor fi terminate, așa cum pare a fi cazul pentru dvs., Mai multe informații despre modul în care bash termină aplicațiile pot fi găsite aici.

Există cazuri în care nohup nu funcționează, de exemplu, atunci când procesul începe reconectează SIGHUP semnal, cum este cazul aici.

subiecte Avansate

locuri de muncă Existente, procese

Unele scoici (de exemplu, bash) oferă o coajă interna care poate fi folosit pentru a preveni SIGHUP fi trimise sau propagate la locurile de muncă existente, chiar dacă acestea nu au început cu nohup., În bash, acest lucru poate fi obținut folosind disown -h job; folosind același builtin fără argumente elimină lucrarea din tabelul de locuri de muncă, ceea ce implică, de asemenea, că lucrarea nu va primi semnalul. Înainte de a utiliza disown pe un loc de muncă activă, ar trebui să fie oprit prin Ctrl-Z, și a continuat în fundal, prin bg comandă. O altă opțiune bash relevantă este shopt huponexit, care trimite automat semnalul HUP la jobs atunci când shell-ul iese normal.,

versiunile AIX și Solaris ale nohup au o opțiune -p care modifică un proces de rulare pentru a ignora semnalele viitoare SIGHUP. Spre deosebire de descris mai sus disown builtin de bash, nohup -p acceptă ID-uri de proces.

Depășirea agățat

Rețineți că nohupping marginalizat de locuri de muncă este de obicei folosit pentru a evita terminarea ei atunci când faceți log off de la distanță o sesiune SSH. O altă problemă care apare adesea în această situație este că ssh refuză să se deconecteze („se blochează”), deoarece refuză să piardă date de la/la jobul(joburile) de fundal., Această problemă poate fi depășită și prin redirecționarea tuturor celor trei fluxuri I/o:

$ nohup ./myprogram > foo.out 2> foo.err < /dev/null &

de asemenea, rețineți că o sesiune SSH de închidere nu trimite întotdeauna un semnal HUP către procese în funcție. Printre altele, acest lucru depinde de faptul dacă un pseudo-terminal a fost alocat sau nu.

Alternative

terminal multiplexer

un terminal multiplexor poate rula o comandă într-o sesiune separată, detașată de terminalul curent, ceea ce înseamnă că, dacă sesiunea curentă se termină, sesiunea detașată și procesele asociate acesteia continuă să ruleze. Se poate reatasa apoi la sesiune mai târziu.,

De exemplu, următoarea invocare a ecranului va rula somescript.sh în fundal de o sesiune detasat:

screen -A -m -d -S somename ./somescript.sh &

renega comanda

renega de comandă este utilizat pentru a elimina locuri de muncă de locuri de muncă masa, sau, pentru a marca locuri de muncă, astfel încât un semnal SIGHUP nu este trimis pe sesiune de reziliere.

Aici este cum puteți să-l încercați:

$ pullftp.sh &$ disown -h$ exit

De la bash bash(1) pagina:

în mod implicit, elimină fiecare JOBSPEC argument din tabelul de locuri de munca active., Dacă opțiunea-h este dată, jobul nu este scos din tabel, ci este marcat astfel încât SIGHUP să nu fie trimis la job dacă shell-ul primește un SIGHUP. Opțiunea-a, atunci când JOBSPEC nu este furnizat, înseamnă a elimina toate locurile de muncă din tabelul de locuri de muncă; opțiunea-r înseamnă a elimina numai locurile de muncă care rulează.

at command

puteți utiliza at command pentru a face coadă la o lucrare pentru o execuție ulterioară. De exemplu, puteți rula pullftp.sh script la coadă (un minut) execuție mai târziu:

$ echo "pullftp.sh" | at now + 1 minute

Lasă un răspuns

Adresa ta de email nu va fi publicată. Câmpurile obligatorii sunt marcate cu *