- Dave McKay
@TheGurkha
- 24 septembrie 2019, ora 8:00 EDT
foloseste Bash shell în Linux pentru a gestiona prim-plan și de fundal procese. Puteți utiliza funcțiile și semnalele de control job Bash pentru a vă oferi mai multă flexibilitate în modul în care executați comenzi. 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, un proces este pornit., „Proces” este numele reprezentării interne a programului de executare în memoria computerului. Există un proces pentru fiecare program activ. De fapt, există un proces pentru aproape tot ceea ce se execută pe computer. Aceasta include componentele mediului desktop grafic (GDE), cum ar fi GNOME sau KDE, și demonii de sistem care sunt lansați la pornire.
De ce aproape tot ceea ce se execută? Ei bine, built-in-urile Bash, cum ar fi cd, pwd și alias, nu trebuie să aibă un proces lansat (sau „născut”) atunci când sunt rulate., 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 le executa. (Puteți introduce help
într-o fereastră terminal pentru a vedea lista de Bash built-in-uri.procesele pot rula în prim-plan, caz în care preiau terminalul dvs. până când s-au finalizat sau pot fi rulate în fundal., Procesele care rulează în fundal nu domină fereastra terminalului și puteți continua să lucrați în ea. Sau cel puțin, nu domină fereastra terminalului dacă nu generează ieșire pe ecran.
un exemplu dezordonat
vom începe un simpluping
trace running. Vom ping
domeniul Cum să Geek. Acest lucru se va executa ca un proces prim-plan.
ping www.howtogeek.com
obținem rezultatele așteptate, derulând în jos fereastra terminalului. Nu putem face nimic altceva în fereastra terminalului în timp ce ping
rulează., Pentru a termina comanda lovit Ctrl+C
.
Ctrl+C
efectul vizibil al Ctrl+C
este evidențiată în captura de ecran. ping
oferă un scurt rezumat și apoi se oprește.
să repetăm asta. Dar de data aceasta vom lovi Ctrl+Z
în loc de Ctrl+C
. Sarcina nu se va termina. Va deveni o sarcină de fundal. Obținem controlul ferestrei terminalului returnat la noi.,
ping www.howtogeek.com
Ctrl+Z
efectul vizibil de a lovi Ctrl+Z
este evidențiată în captura de ecran.de data aceasta ni se spune că procesul este oprit. Oprit nu înseamnă terminat. E ca o mașină la un semn de oprire. Nu l-am casat și l-am aruncat. Este încă pe drum, staționar, așteptând să plece. Procesul este acum un loc de muncă de fundal.
comanda jobs
va lista lucrările care au fost pornite în sesiunea curentă a terminalului., Și pentru că joburile sunt (inevitabil) procese, putem folosi și comanda ps
pentru a le vedea. Să folosim ambele comenzi și să comparăm ieșirile lor. Vom folosi opțiuneaT
opțiune (terminal) pentru a lista numai procesele care rulează în această fereastră terminal. Rețineți că nu este nevoie să utilizați o cratimă -
cu opțiunea T
.
jobs
ps T
jobs
comanda ne spune:
- : numărul din paranteze reprezintă numărul de locuri de muncă., Putem folosi acest lucru pentru a ne referi la job atunci când trebuie să-l controlăm cu comenzi de control job.
- +: 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 anumit număr de job. Se numește lucrarea implicită. Jobul implicit este întotdeauna cel mai recent adăugat la lista de joburi. - oprit: procesul nu se execută.
- ping www.howtogeek.com: linia de comandă care a lansat procesul.,
comanda ps
ne spune:
- PID: ID-ul procesului procesului. Fiecare proces are un ID unic.
- TTY: pseudo-teletype (terminal window) din care a fost executat procesul.
- STAT: starea procesului.
- timp: 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 de așteptare pentru intrare sau de ieșire, și nu poate fi întreruptă.,
- I: inactiv.
- R: rulează.
- S: somn întreruptibil.
- T: Oprit de un semnal de control de locuri de muncă.
- Z: un proces zombie. Procesul a fost încheiat, dar nu a fost „curățat” de procesul părinte.
Publicitatevaloarea în STAT coloana poate fi urmat de unul din aceste extra indicatori:
- <: sarcină de Mare prioritate (nu-i frumos să-alte procese).
- N: prioritate scăzută (plăcută altor procese).
- L: procesul are pagini blocate în memorie (utilizate de obicei de procesele în timp real).,
- s: un lider de sesiune. Un lider de sesiune este un proces care a lansat grupuri de proces. Un shell este un lider de sesiune.
- l: proces Multi-thread.
- +: un proces prim-plan.
putem vedea că Bash are o stare de
Ss
. Majuscule ” S ” ne spun Shell Bash este de dormit, și este întreruptible. De îndată ce avem nevoie, va răspunde. Minuscule ” s ” ne spune că shell-ul este un lider de sesiune.comanda ping are o stare de
T
., Acest lucru ne spune căping
a fost oprit de un semnal de control de locuri de muncă. În acest exemplu, acesta a fostCtrl+Z
pe care l-am pus în fundal.comanda
ps T
are o stare deR
, care înseamnă rularea.+
indică faptul că acest proces este un membru al grupului prim-plan. Deci comandaps T
rulează în prim-plan.comanda bg
comanda
bg
este utilizată pentru a relua un proces de fundal., Acesta poate fi utilizat cu sau fără un număr de locuri de muncă. Dacă îl folosești 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.PublicitateDacă am problema
bg
comanda, ne vom reluaping
command:bg
ping
comanda de cv-uri si vom vedea defilare de ieșire în fereastra terminalului, o dată mai mult. Numele comenzii care a fost repornită este afișat pentru dvs., Acest lucru este evidențiat în captura de ecran.dar avem o problemă. Sarcina se execută în fundal și nu va accepta de intrare. Deci, cum o oprim?
Ctrl+C
nu face nimic. O putem vedea când o tastăm, dar sarcina de fundal nu primește acele apăsări de taste, astfel încât să păstreze ping-ul vesel.publicitatede fapt, suntem acum într-un mod ciudat amestecat. Putem tasta în fereastra terminalului, dar ceea ce tastăm este rapid îndepărtat de ieșirea de defilare din comanda
ping
. Orice tastăm intră în vigoare în prealabil.,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 comandabg
, poate fi utilizată cu sau fără un număr de job. Folosind-o cu un număr de locuri de muncă înseamnă că va funcționa pe un anumit loc de muncă. În cazul în care este utilizat fără un număr de locuri de muncă ultima comandă care a fost trimis la fundal este utilizat.dacă tastăm
fg
comanda noastrăping
va fi adusă în prim-plan., Caracterele pe care le tastăm sunt amestecate cu ieșirea din comandaping
, 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
PublicitateȘi acum, că avem
ping
comandă execută în prim-plan o dată mai mult, putem folosiCtrl+C
să-l omoare.Ctrl+C
trebuie să trimitem semnalele corecte
care nu au fost tocmai drăguțe., În mod evident, rularea unui proces în fundal funcționează cel mai bine atunci când procesul nu produce ieșire și nu necesită intrare.
dar, dezordonat sau nu, exemplul nostru a realizat:
- punerea unui proces în fundal.
- restaurarea procesului la o stare de funcționare în fundal.
- revenirea procesului în prim-plan.
- terminarea procesului.
când utilizați
Ctrl+C
șiCtrl+Z
, trimiteți semnale procesului. Acestea sunt modalități prescurtate de utilizare a comenziikill
., Există 64 de semnale diferite pe carekill
le poate trimite. Utilizațikill -l
la linia de comandă pentru a le lista.kill
nu este singura sursă a acestor semnale. Unele dintre ele sunt ridicate automat de alte procese din sistemiată câteva dintre cele utilizate în mod obișnuit.
- SIGHUP: semnal 1. Trimis automat la un proces atunci când terminalul se execută în este închis.
- SIGINT: semnal 2. Trimis la un proces te-a lovit
Ctrl+C
. Procesul este întrerupt și i se spune să înceteze., - SIGQUIT: semnal 3. Trimis la un proces dacă utilizatorul trimite un semnal quit
Ctrl+D
. - SIGKILL: semnal 9. Procesul este imediat ucis și nu va încerca să închidă curat. Procesul nu coboară grațios.
- SIGTERM: semnal 15. Acesta este semnalul implicit trimis de
kill
. Este semnalul standard de terminare a programului. - SIGTSTP: semnal 20. Trimis la un proces atunci când utilizați
Ctrl+Z
. Oprește procesul și îl pune în fundal.,
trebuie să folosim comanda
kill
pentru a emite semnale care nu au combinații de taste atribuite acestora.controlul suplimentar al lucrării
un proces mutat în fundal folosind
Ctrl+Z
este plasat în starea oprită. Trebuie să folosim comandabg
pentru a o porni din nou. Pentru a lansa un program ca un proces de fundal care rulează 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 o fac. Trebuie să avem ceva în capturile de ecran la care ne putem referi. Această comandă va începe o buclă nesfârșită ca proces de fundal:în timp ce este adevărat; faceți ecou „cum să faceți procesul de buclă Geek”; sleep 3; done &
ni se spune numărul postului și ID-ul procesului id al procesului. Numărul postului nostru este 1, iar id-ul procesului este 1979. Putem folosi acești identificatori pentru a controla procesul.,
publicitateieș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 ieșirea din procesul de buclă.
este
Pentru a opri procesul nostru putem folosi
jobs
să ne reamintim ce numărul de locuri de muncă este, și de a folosi apoikill
.jobs
raportează că procesul nostru este numărul postului 1. Pentru a utiliza acest număr cukill
trebuie să preceadă cu un semn la sută%
.,jobs
kill %1
kill
trimiteSIGTERM
semnal, semnal numărul 15, a procesului și este încheiată. Când tasta Enter este apăsată apoi, este afișată o stare a lucrării. Acesta listează procesul ca ” terminat.”În cazul în care procesul nu răspunde lakill
comanda puteți să-l ia o crestătură. Utilizațikill
cuSIGKILL
, numărul semnalului 9. Doar puneți numărul 9 între comandakill
numărul jobului.,kill 9 %1
Lucrurile de care Ne-am Acoperit
- Ctrl+C: Trimite
SIGINT
, 2 de semnal, la procesul—dacă este acceptat de intrare—și spune-l pentru a termina. - Ctrl + D: trimite
SISQUIT
, semnal 3, la proces—dacă acceptă intrarea—și îi spune să renunțe. - Ctrl + Z: trimite
SIGSTP
, semnal 20, la proces și îi spune să se oprească (suspende) și să devină un proces de fundal. - joburi: listează joburile de fundal și arată numărul lor de job.
- bg job_number: repornește un proces de fundal., Dacă nu furnizați un număr de locuri de muncă ultimul proces care a fost transformat într-o sarcină de fundal este utilizat.
- FG job_number: aduce un proces de fundal în prim-plan și îl repornește. Dacă nu furnizați un număr de locuri de muncă ultimul proces care a fost transformat într-o sarcină de fundal este utilizat.
- commandline &: Adăugarea unui ampersand
&
la sfârșitul anului o linie de comandă execută comanda ca o sarcină de fundal, pe care se execută. - kill % job_number: trimite
SIGTERM
, semnal 15, la procesul de a termina., - ucide 9 %job_number: Trimite
SIGKILL
, semnal 9, la procesul și se termină brusc.
RELATED: cum să ucizi procesele de pe terminalul Linux
Dave McKay
Dave McKay a folosit pentru prima dată computerele când banda de hârtie perforată era în vogă și de atunci programează. După peste 30 de ani în industria IT, acum este jurnalist tehnologic cu normă întreagă., În timpul carierei sale, a lucrat ca programator independent, manager al unei echipe internaționale de dezvoltare de software, manager de proiect pentru servicii IT și, cel mai recent, ca responsabil cu protecția datelor. Dave este un evanghelist Linux și avocat open source.Citeste tot Bio ”