Precedent | Cuprins | Următor
În lecția precedentă, am analizat unele dintre implicațiile faptului că Linux este un sistem de operare multi-utilizator. În această lecție, vom examina natura multitasking a Linux și modul în care aceasta este controlată cu ajutorul interfeței liniei de comandă.
Ca orice sistem de operare multitasking, Linux execută mai multe procese multiple,simultane. Ei bine, ele par simultane, în orice caz. De fapt, un singur nucleu de procesor nu poate executa decât un singur proces la un moment dat, dar kernelul Linux reușește să dea fiecărui proces rândul său la procesor și fiecare pare să ruleze în același timp.
Există mai multe comenzi care sunt folosite pentru a controla procesele. Acestea sunt:
-
ps
– listează procesele care rulează pe sistem -
kill
– trimite un semnal către unul sau mai multe procese (de obicei pentru a „omorî” un proces) -
jobs
– un mod alternativ de a lista propriile procese -
bg
. a pune un proces în fundal -
fg
– a pune un proces în prim-plan
Un exemplu practic
Deși se poate părea că acest subiect este destul de obscur, el poate fi foartepractic pentru utilizatorul mediu care lucrează mai ales cu interfața grafică a utilizatorului. Deși s-ar putea să nu fie evident, cele mai multe (dacă nu toate) programele grafice pot fi lansate din linia de comandă. Iată un exemplu: există un mic program furnizat cu sistemul X Window numit xload, care afișează un grafic reprezentând încărcarea sistemului. Putem executa acest program tastând următoarele:
xload
Observați că apare o mică fereastră xload
și începe să afișeze graficul de încărcare a sistemului. Pe sistemele în care xload
nu este disponibil, încercați gedit
în schimb. Observați, de asemenea, că promptul nostru nu a reapărut după ce programul a fost lansat. Shell-ul așteaptă ca programul să se termine înainte de a returna controlul. Dacă închidem fereastra xload
, programul xload se termină și promptul revine.
Punerea unui program în fundal
Acum, pentru a ne face viața un pic mai ușoară, vom lansa din nou programul xload, dar de data aceasta îl vom pune în fundal, astfel încât promptul să revină. Pentru a face acest lucru, executăm xload astfel:
xload &
1223$În acest caz, promptul s-a întors pentru că procesul a fost pus în fundal.
Imaginați-vă acum că am uitat să folosim simbolul „&” pentru a pune programul în fundal. Există încă o speranță. Putem tasta Ctrl-z
și procesul va fi suspendat. Putem verifica acest lucru văzând că fereastra programului este înghețată. Procesul există în continuare, dar este inactiv. Pentru a relua procesul în fundal, tastați comanda bg
(prescurtare de labackground). Iată un exemplu:
xload
+ Stopped xload$ bg
+ xload &Lista proceselor care rulează
Acum că avem un proces în fundal, ar fi util să afișămo listă a proceselor pe care le-am lansat. Pentru a face acest lucru, putem folosi fie comandajobs
, fie comanda mai puternică ps.
jobs
+ Rularea xload&$ ps
PID TTY TIME CMD1211 pts/4 00:00:00:00 bash1246 pts/4 00:00:00:00 xload1247 pts/4 00:00:00:00 ps$Urmărirea unui proces
Să presupunem că avem un program care devine insensibil; cum scăpăm de el? Folosim comandakill
, bineînțeles. Să încercăm acest lucru pexload
. În primul rând, trebuie să identificăm procesul pe care dorim să-l omorâm. Putem folosi fiejobs
, fieps
, pentru a face acest lucru. Dacă folosim jobs, vom primi înapoi un număr de job. Cups
, ni se dă un ID de proces (PID). O vom face bothways:
xload &
1292$ jobs
+ Running xload&$ kill %1
$ xload &
1293 Terminat xload$ ps
PID TTY TIME CMD1280 pts/5 00:00:00 bash1293 pts/5 00:00:00:00 xload1294 pts/5 00:00:00 ps$ kill 1293
+ Terminat xload$Un pic mai mult despre kill
În timp ce comanda kill
este folosită pentru a „ucide” procese, scopul său real este de a trimite semnale proceselor. De cele mai multe ori, semnalul este menit să spună procesului să plece, dar există mai mult decât atât. Programele (dacă sunt scrise în mod corespunzător) ascultă semnalele de la sistemul de operare și răspund la ele, cel mai adesea pentru a permite o metodă grațioasă de terminare. De exemplu, un editor de text poate asculta orice semnal care indică faptul că utilizatorul se deconectează sau că se oprește calculatorul. Atunci când primește acest semnal, ar putea salva munca în curs înainte de a ieși. Comanda kill
poate trimite o varietate de semnale către procese. Tastând:
kill -l
va imprima o listă a semnalelor pe care le suportă. Multe sunt destul de obscure, dar câteva sunt utile de știut:
Semnal # | Nume | Descriere |
1 | SIGHUP | Semnal de închidere. Programele pot asculta acest semnal și pot acționa în funcție de el. Acest semnal este trimis proceselor care rulează într-un terminal atunci când închideți terminalul. |
2 | SIGINT | Semnal de întrerupere. Acest semnal este dat proceselor pentru a le întrerupe. Programele pot procesa acest semnal și pot acționa în funcție de el. De asemenea, putem emite acest semnal direct, tastând Ctrl-c în fereastra terminalului în care se execută programul. |
15 | SIGTERM | Semnal de terminare. Acest semnal este dat proceselor pentru a le încheia. Din nou, programele pot procesa acest semnal și pot acționa în funcție de el. Acesta este semnalul implicit trimis de comanda kill în cazul în care nu este specificat niciun semnal. |
9 | SIGKILL | Semnal de ucidere. Acest semnal determină terminarea imediată a procesului de către nucleul Linux. Programele nu pot asculta acest semnal. |
Acum să presupunem că avem un program care se blochează iremediabil și vrem să scăpăm de el. Iată ce facem:
- Utilizați comanda
ps
pentru a obține ID-ul de proces (PID) al procesului pe care dorim să îl terminăm. - Emiteți o comandă
kill
pentru acel PID. - Dacă procesul refuză să se termine (de ex, acesta ignoră semnalul), trimiteți semnale din ce în ce mai dure până când se termină.
ps x | grep bad_program
PID TTY TTY STAT TIME COMMAND2931 pts/5 SN 0:00 bad_program$ kill -SIGTERM 2931
$ kill -SIGKILL 2931
În exemplul de mai sus am folosit comanda ps
cu opțiunea x pentru a lista toate procesele noastre (chiar și cele care nu sunt lansate din terminalul curent). În plus, am canalizat ieșirea comenzii ps în grep
pentru a lista doar programul care ne interesează. Apoi, am folosit kill pentru a emite un semnal SIGTERM către programul problematic.În practica reală, este mai frecvent să se procedeze în felul următor, deoarece semnaluldefault trimis de kill
este SIGTERM, iar kill poate folosi și numărul semnalului în locul numelui semnalului:
kill 2931
Apoi, dacă procesul nu se termină, forțați-l cu semnalul SIGKILL:
kill -9 2931
Așa este!
Aceasta încheie seria de lecții „Learning the Shell”. În următoarea serie, „Scrierea scripturilor Shell”, vom examina cum să automatizăm sarcini cu ajutorul theshell-ului.
Lecturi suplimentare
- Pentru o tratare mai aprofundată a subiectului, consultați capitolul 10 din Linia de comandă Linux.
- 1963 Timesharing: A Solution to Computer Bottlenecks, un videoclip fascinant de pe YouTube de la Computer History Museum care descrie primul sistem de operare timesharing și modul în care acesta funcționează. Este practic aceeași metodă folosită de toate computerele moderne.