Cum să rulați și să controlați procesele de fundal pe Linux

Utilizați shell-ul Bash în Linux pentru a gestiona procesele din prim-plan și din fundal. Puteți utiliza funcțiile și semnalele de control al jobului Bash pentru a vă oferi mai multă flexibilitate în modul în care rulați comenzile. Vă arătăm cum.

Totul despre procese

Ori de câte ori un program este executat într-un sistem de operare Linux sau Unix, este pornit un proces. „Proces” este numele pentru reprezentarea internă a programului care se execută în memoria computerului. Există un proces pentru fiecare program activ. De fapt, există un proces pentru aproape tot ceea ce rulează pe computerul tău. Aceasta include componentele dvs mediu desktop grafic (GDE) cum ar fi GNOME sau KDE, și sistem demonii care sunt lansate la pornire.

De ce aproape tot ce rulează? Ei bine, integrate Bash, cum ar fi CD, pwd, și alias nu trebuie să aibă un proces lansat (sau „generat”) când sunt rulați. Bash execută aceste comenzi în instanța shell-ului Bash care rulează în fereastra terminalului. Aceste comenzi sunt rapide tocmai pentru că nu trebuie să aibă un proces lansat pentru a fi executate. (Puteți să tastați ajutor într-o fereastră de terminal pentru a vedea lista de încorporate Bash.)

Procesele pot fi rulate în prim-plan, caz în care preiau terminalul tău până la finalizare, sau pot fi rulate în fundal. Procesele care rulează în fundal nu domină fereastra terminalului și poți continua să lucrezi în ea. Sau cel puțin, nu domină fereastra terminalului dacă nu generează ieșire pe ecran.

Un exemplu dezordonat

Vom începe un simplu ping urme de alergare. Vom face ping la domeniul How-To Geek. Acesta se va executa ca proces în prim-plan.

ping www.wdzwdz.com

Obținem rezultatele așteptate, derulând în jos fereastra terminalului. Nu putem face nimic altceva în fereastra terminalului în timp ce rulează ping. Pentru a termina comanda apăsați Ctrl+C.

Ctrl+C

Efectul vizibil al Ctrl+C este evidențiat în captură de ecran. ping oferă un scurt rezumat și apoi se oprește.

Să repetăm ​​asta. Dar de data aceasta vom apăsa Ctrl+Z în loc de Ctrl+C. Sarcina nu va fi încheiată. Va deveni o sarcină de fundal. Obținem controlul asupra ferestrei terminalului.

ping www.wdzwdz.com
Ctrl+Z

Efectul vizibil al atingerii Ctrl+Z este evidențiat în captură de ecran.

De data aceasta ni se spune că procesul este oprit. Oprit nu înseamnă terminat. Este ca o mașină la un semn de oprire. Nu l-am casat și nu l-am aruncat. E încă pe drum, staționar, așteaptă să plece. Procesul este acum o muncă de fundal.

Comanda joburi va enumera locurile de muncă care au fost pornite în sesiunea curentă de terminal. Și pentru că joburile sunt (inevitabil) procese, putem folosi și comanda ps pentru a le vedea. Să folosim ambele comenzi și să le comparăm ieșirile. Vom folosi opțiunea T (terminal) pentru a lista numai procesele care rulează în această fereastră de terminal. Rețineți că nu este nevoie să folosiți o cratimă – cu opțiunea T.

jobs
ps T

Comanda jobs ne spune:

  Cum să obțineți un instrument de gestionare a timpului bazat pe terminal pe Linux cu Taskwarrior

[1]: Numărul dintre paranteze drepte este numărul locului de muncă. Putem folosi acest lucru pentru a face referire la job atunci când trebuie să îl controlăm cu comenzile de control al jobului.
+: Semnul plus + arată că acesta este jobul asupra căruia se va acționa dacă folosim o comandă de control al jobului fără un număr specific de job. Se numește job implicit. Lucrarea implicită este întotdeauna cea adăugată cel mai recent la lista de locuri de muncă.
Oprit: procesul nu rulează.
ping www.wdzwdz.com: linia de comandă care a lansat procesul.

Comanda ps ne spune:

PID: ID-ul procesului. Fiecare proces are un ID unic.
TTY: pseudo-teletip (fereastră terminală) de la care a fost executat procesul.
STAT: Starea procesului.
TIME: cantitatea de timp CPU consumată de proces.
COMANDĂ: Comanda care a lansat procesul.

Acestea sunt valori comune pentru coloana STAT:

D: Somn neîntrerupt. Procesul este într-o stare de așteptare, de obicei așteptând intrare sau ieșire și nu poate fi întrerupt.
Eu: Inactiv.
R: Alergând.
S: Somn întreruptibil.
T: oprit de un semnal de control al lucrării.
Z: Un proces zombi. Procesul a fost încheiat, dar nu a fost „curățat” de procesul părinte.

Valoarea din coloana STAT poate fi urmată de unul dintre acești indicatori suplimentari:

<: high-priority="" task="" nice="" to="" other="" processes="" n:="" low-priority="" l:="" process="" has="" pages="" locked="" into="" memory="" used="" by="" real-time="" s:="" a="" session="" leader.="" leader="" is="" that="" launched="" groups.="" shell="" multi-thread="" process.="" foreground="">Putem vedea că Bash are o stare de Ss. „S” majuscul ne spune că shell-ul Bash doarme și este întreruptibil. De îndată ce avem nevoie, va răspunde. „S” minuscul ne spune că shell-ul este un lider de sesiune.

Comanda ping are starea T. Aceasta ne spune că ping-ul a fost oprit de un semnal de control al jobului. În acest exemplu, acesta a fost Ctrl+Z pe care l-am folosit pentru a-l pune în fundal.

Comanda ps T are o stare R, care înseamnă rulare. + indică faptul că acest proces este membru al grupului din prim-plan. Deci comanda ps T rulează în prim-plan.

Comanda bg

Comanda bg este folosită pentru a relua un proces de fundal. Poate fi folosit cu sau fără un număr de job. Dacă îl utilizați fără un număr de job, jobul implicit este adus în prim-plan. Procesul rulează încă în fundal. Nu puteți trimite nicio intrare la acesta.

Dacă lansăm comanda bg, vom relua comanda ping:

bg

Comanda ping se reia și vedem încă o dată rezultatul de defilare în fereastra terminalului. Numele comenzii care a fost repornită este afișat pentru dvs. Acest lucru este evidențiat în captură de ecran.

  Cum se instalează Scribus Publisher pe Linux

Dar avem o problemă. Sarcina rulează în fundal și nu va accepta intrare. Deci cum o oprim? Ctrl+C nu face nimic. Îl putem vedea când îl tastăm, dar sarcina de fundal nu primește acele apăsări de taste, așa că continuă să sune vesel.

De fapt, acum suntem într-un mod ciudat amestecat. Putem tasta în fereastra terminalului, dar ceea ce scriem este îndepărtat rapid de rezultatul de defilare din comanda ping. Orice introducem intră în vigoare în primul rând.

Pentru a opri sarcina noastră de fundal, trebuie să o aducem în prim-plan și apoi să o oprim.

Comanda fg

Comanda fg va aduce o sarcină de fundal în prim-plan. La fel ca și comanda bg, poate fi folosită cu sau fără un număr de job. Folosirea acestuia cu un număr de job înseamnă că va funcționa la o anumită lucrare. Dacă este folosit fără un număr de job, se folosește ultima comandă care a fost trimisă în fundal.

Dacă tastăm fg comanda noastră ping va fi adusă în prim-plan. Caracterele pe care le introducem sunt amestecate cu ieșirea din comanda ping, dar sunt operate de shell ca și cum ar fi fost introduse pe linia de comandă ca de obicei. Și de fapt, din punctul de vedere al shell-ului Bash, exact asta s-a întâmplat.

fg

Și acum că avem din nou comanda ping care rulează în prim-plan, putem folosi Ctrl+C pentru a o opri.

Ctrl+C

Trebuie să trimitem semnalele potrivite

Nu a fost tocmai frumos. Evident, rularea unui proces în fundal funcționează cel mai bine atunci când procesul nu produce rezultate și nu necesită intrare.

Dar, dezordonat sau nu, exemplul nostru a reușit:

Punerea unui proces în fundal.
Restabilirea procesului la starea de rulare în fundal.
Revenirea procesului în prim-plan.
Încheierea procesului.

Când utilizați Ctrl+C și Ctrl+Z , trimiteți semnale către proces. Acestea sunt moduri de stenografie de folosire a comenzii kill. Sunt 64 de semnale diferite acea ucidere poate trimite. Folosiți kill -l la linia de comandă pentru a le lista. uciderea nu este singura sursă a acestor semnale. Unele dintre ele sunt generate automat de alte procese din cadrul sistemului

Iată câteva dintre cele utilizate în mod obișnuit.

SIGHUP: Semnal 1. Trimis automat unui proces atunci când terminalul în care rulează este închis.
SIGINT: Semnal 2. Trimis la un proces pe care ai apăsat Ctrl+C. Procesul este întrerupt și i se spune să se încheie.
SIGQUIT: Semnal 3. Trimis unui proces dacă utilizatorul trimite un semnal de ieșire Ctrl+D.
SIGKILL: Semnal 9. Procesul este imediat oprit și nu va încerca să se închidă curat. Procesul nu decurge cu grație.
SIGTERM: Semnal 15. Acesta este semnalul implicit trimis prin kill. Este semnalul standard de terminare a programului.
SIGTSTP: Semnal 20. Trimis unui proces atunci când utilizați Ctrl+Z. Oprește procesul și îl pune în fundal.

  Cum se face upgrade la Linux Mint 19

Trebuie să folosim comanda kill pentru a emite semnale care nu au combinații de taste atribuite.

Control suplimentar al locurilor de muncă

Un proces mutat în fundal folosind Ctrl+Z este plasat în starea oprită. Trebuie să folosim comanda bg pentru a porni din nou să ruleze. Pentru a lansa un program ca proces în fundal este simplu. Adăugați un ampersand & la sfârșitul liniei de comandă.

Deși cel mai bine este ca procesele de fundal să nu scrie în fereastra terminalului, vom folosi exemple care fac. Trebuie să avem ceva în capturile de ecran la care să ne putem referi. Această comandă va porni o buclă nesfârșită ca proces de fundal:

în timp ce adevărat; face eco „Procesul buclei Geek”; somn 3; Terminat &

în timp ce adevărat;  face ecou

Ni se spune numărul jobului și ID-ul procesului. Numărul jobului nostru este 1, iar ID-ul procesului este 1979. Putem folosi acești identificatori pentru a controla procesul.

Ieșirea din bucla noastră nesfârșită începe să apară în fereastra terminalului. Ca și înainte, putem folosi linia de comandă, dar orice comenzi pe care le emitem sunt intercalate cu rezultatul procesului de buclă.

ls

Pentru a ne opri procesul, putem folosi joburi pentru a ne reaminti care este numărul jobului și apoi folosim kill.

jobs raportează că procesul nostru este numărul locului de muncă 1. Pentru a folosi acel număr cu kill, trebuie să îl precedăm cu un semn procentual %.

jobs
kill %1

kill trimite semnalul SIGTERM, semnalul numărul 15, către proces și acesta este terminat. La următoarea apăsare a tastei Enter, este afișată starea lucrării. Acesta listează procesul ca fiind „încheiat”. Dacă procesul nu răspunde la comanda kill, o puteți lua mai mult. Folosește kill cu SIGKILL, semnalul numărul 9. Pune doar numărul 9 între comanda kill și numărul jobului.

kill 9 %1

Lucruri pe care le-am acoperit

Ctrl+C: Trimite SIGINT, semnal 2, către proces – dacă acceptă intrare – și îi spune să se termine.
Ctrl+D: Trimite SISQUIT, semnalul 3, către proces – dacă acceptă intrare – și îi spune să iasă.
Ctrl+Z: Trimite SIGSTP, semnal 20, către proces și îi spune să se oprească (suspendă) și să devină un proces de fundal.
joburi: listează joburile de fundal și arată numărul jobului acestora.
bg job_number: Repornește un proces de fundal. Dacă nu furnizați un număr de job, se folosește ultimul proces care a fost transformat într-o sarcină de fundal.
fg job_number: aduce un proces de fundal în prim-plan și îl repornește. Dacă nu furnizați un număr de job, se folosește ultimul proces care a fost transformat într-o sarcină de fundal.
comandă &: Adăugarea unui ampersand & la sfârșitul unei linii de comandă execută acea comandă ca sarcină de fundal, care rulează.
kill %job_number: Trimite SIGTERM, semnal 15, procesului pentru a-l termina.
kill 9 %job_number: Trimite SIGKILL, semnalul 9, procesului și îl încheie brusc.