Unelte utilizator

Unelte site


kill_-9

A cui a fost ideea?

Mi-a atras atenţia faptul că un mare număr de utilizatori consideră că folosirea comenzii kill -9 în orice circumstanţă este o idee grozavă. Cine sunt aceşti utilizatori şi cum au căpătat un astfel de obicei? Aş vrea să ştiu!

Semnale

În Unix există nişte lucruri numite semnale, şi care reprezintă o modalitate de exprimare a evenimentelor care apar în sistem. Sunt multe tipuri de semnale transmise unui proces, dintr-o gamă variată de motive. Când un proces primeşte un semnal, îl poate ignora sau îl poate „capta“ şi executa un o funcţie de tratare a semnalului, „signal handler“. Această operaţie poartă numele de „captare“. Semnalele care nu pot fi captate au o acţiune care în principiu se traduce ca „nu face nimic“ sau „exit“. Două semnale nu pot fi captate: SIGKILL şi SIGSTOP.

Există o comandă numită kill care transmite un semnal unui proces.
kill -semnal pid va transmite semnal la pid.
kill -l va lista toate semnalele disponibile.

Veţi observa că fiecare are un număr şi un nume simbolic. Sunt trei semnale folosite în mod obişnuit pentru a închide un proces: SIGTERM (15, terminate), SIGINT (2, interrupt), şi SIGKILL (9, kill, untrappable, „El Diablo“).

Închiderea proceselor

Cele mai multe programe au nevoie de o anumită rutină când se închid. Aceste programe stabilesc o funcţie de tratare a semnalului pentru a face aceste sarcini de curăţare ca rezultat al SIGTERM sau SIGINT. Ele ar folosi o astfel de funcţie şi pentru SIGKILL dacă ar putea, dar SIGKILL este un semnal ce nu poate fi captat.

Dacă un program prinde semnalele TERM sau INT, atunci probabil că va şterge orice fişiere temporare, închide socketurile, elibera segmentele de memorie folosite, va închide fişierele deschise, sau va face alte operaţii. De exemplu, MySQL are nevoie să pună datele pe HDD şi să închidă fişierele din bazele de date. Închiderea MySQL cu -9 va strica baza de date. Cele mai multe aplicaţii necesită în timpul lucrului fişiere temporare, iar folosirea kill -9 pe aceste aplicaţii va lăsa aceste fişiere intacte. Daemonii de reţea au nevoie să îşi salveze corect logurile şi să închidă corect socketurile Internet astfel încât clienţii să nu rămână blocaţi. Închiderea unui web browser poate corupe colecţia de adrese, fişierele de cache, lăsa fişierele temporare în /tmp (îţi aminteşti de acel fisier mpeg de 20MB pe care ai dat click? da, încă se află în /tmp)

Folosirea kill -9 este ca şi cum aţi apăsa butonul de Power al unui PC care funcţionează. Ştiţi deja că închiderea unui PC de la buton vă poate strica sistemul de fişiere din cauza datelor inconsistente folosite în modul de lucru, de ce aţi face acelaşi lucru cu o aplicaţie? Riscaţi exact aceeaşi corupere de date.

HOWTO

Astfel, deoarece este atât de important ca aplicaţiile să se închidă în mod corect, trebuie să urmaţi acestă procedură pentru a le închide:

kill pid (trimite semnalul TERM, aşteaptă 5 secunde)
kill pid (da, încearcă din nou, aşteaptă 5 secunde)
kill -INT pid (aşteaptă)
kill -INT pid (damn, still not dead?)
kill -KILL pid (acelaşi lucru cu -9)
kill -KILL pid (ceva este în neregulă)

Dacă procesul încă rulează, atunci nu-i mai trimiteţi semnale. Este fie prins în aşteptarea I/O fie Defunct. Folosiţi comanda ps auxw | grep processname, dacă vedeţi că este în starea D, atunci închideţi procesul părinte (a treia coloană dată de comanda ps -ef este pid-ul procesului părinte). Dacă este prins în aşteptarea I/O atunci sunt probleme mult mai complexe cu sistemul pe care îl aveţi. Cei mai mulţi utilizatori nu vor avea acestă problemă.

Articolul original

adyx 2005/04/20

kill_-9.txt · Ultima modificare: 2008/05/31 20:10 (editare externă)