Cum se închide terminalul fără a ucide a lansat în echipa

Uneori trebuie să „decupla“ programul din fereastra terminalului în care se execută. De exemplu, vă conectați la un server de la distanță prin SSH, executați sarcina, care nu este un demon, dar punerea în aplicare a care necesită o mulțime de timp (ar putea fi zile sau luni). Dacă închideți terminalul sau să repornește sesiunea SSH, programul de funcționare, pur și simplu nu mai funcționează.

Un alt exemplu de o situație în care poate fi necesar, să lucrați cu un server fără cap (fără un mediu desktop grafic), și din acest motiv, nu se poate deschide mai multe ferestre terminale. Deci, doriți să traducă programul în fundal pentru a continua să lucreze cu terminalul.

Acest articol descrie opțiunile pentru modul de a închide terminalul fără a opri programul de funcționare în ea.

Pentru a face acest lucru, există două soluții:

Să vedem, dar ceea ce este diferența dintre

Să aruncăm o privire la ceea ce se întâmplă atunci când comanda este rulată dintr-un shell interactiv (conectat la terminalul) fără (Și fără nici o redirecționări). Deci, să presupunem că ați tastat pur și simplu foo (ca un exemplu de comandă), atunci:

  • Creat foo proces.
  • stdin Moștenește (input standard), stdout (output standard) și stderr (eroarea standard) al carcasei. Prin urmare, este de asemenea conectat la același terminal.
  • Dacă mantaua primește (semnalul transmis la procesul de pierderea notificării la conexiunile de control de către terminalul de utilizator) SIGHUP, acesta trimite proces SIGHUP (procedeu care duce de obicei la finalizare).
  • așteaptă Altfel shell (blocat) până când procesul este finalizat.

Acum, să vedem ce se întâmplă atunci când vom traduce procesul în fundal, acesta este setat foo .

Acum elimină renega sarcina din lista de sarcini shell, prin urmare, toate literele de mai sus aplicate mai (inclusiv trimiterea procesului de coajă de semnal SIGHUPl). Cu toate acestea, amintiți-vă că acesta este în continuare conectat la terminal, astfel încât în ​​cazul în care terminalul este distrus (care se poate întâmpla în cazul în care acesta a fost un pty, cum ar fi cele create de xtermor sau ssh. Și un program de monitorizare a finalizat închiderea xterm sau închiderea -Connection SSH), program Acesta nu va reuși imediat ce ea este onorata sa citeasca de la intrarea standard și scrie la iesirea standard.

Ce nohup odelaet. Pe de o parte, separă în mod activ procesul de terminal:

Amintiți-vă că nohup nu elimină procesul de sarcinile de control coajă și, de asemenea, pune-l în fundal (dar, ca nohup sarcină în prim-plan este aproape inutil, apoi începe de obicei cu ). De exemplu, spre deosebire de dezmoșteni. coajă încă vă va spune când sarcina este finalizată nohup (desigur, în cazul în care shell-ul nu este închis înainte de aceasta).

Dacă se utilizează împreună, toate cele trei renega. nohup și . procesul va fi rulează în fundal este eliminat din sarcinile de control shell și deconectate efectiv de la terminal.

nohup execută instrucțiunile ignorand semnalele hangup.

Nohup posibile opțiuni:

În cazul în care intrarea standard este un terminal, acesta este luat din fișierul imposibil de citit.

Daca iesirea standard este un terminal, se adaugă la ieșire la «nohup.out», dacă este posibil, în caz contrar «$ HOME / nohup.out».

Dacă eroarea standard este un terminal, redirectiona la iesirea standard. Pentru a scrie ieșire la un fișier, folosiți «COMMAND nohup> FILE“.

NOTĂ: shell-ul poate avea propria sa versiune de nohup. care acoperă, de obicei, versiunea descrisă aici. Vă rugăm să consultați documentația pentru shell-ul pentru a afla despre opțiunile pe care le susține.

Notă se bazează pe surse:

Distribuiți „Cum se închide terminalul de funcționare fără a ucide-l în echipa“