Il giorno dei morti sta arrivando ed è per questo che vogliamo fare questo piccolo tutorial di LxA per parlare del processi zombie e come possiamo ucciderli. La prima cosa da dire è cos'è il processo zombie, e cioè che, come sapete, il kernel Linux ha un sottosistema per gestire i processi e lavora con lo scheduler per creare, variare la priorità, inviare o rimuovere il flusso di elaborazione della CPU e uccidere i processi. Bene, questa parte del kernel, come il resto dei sistemi simili a Unix, distingue tra vari stati dei processi ...
Quindi possiamo trovarlo un processo può essere nello stato dormiente (S), cioè addormentato. Anche i processi in uno stato di esecuzione (R) che sono quelli attualmente in esecuzione o in esecuzione, i processi in attesa (D) che vengono interrotti in attesa di essere assistiti, gestiti (T) o sospesi, e anche lo zombi (Z) o il deceduto. Un processo zombie o morto è già stato terminato con successo, ma alcune risorse di sistema sono state dirottate poiché Linux le sta ancora salvando nella tabella dei processi. Sai già che quando un processo finisce, non dovrebbe rimanere in questo stato, ma si completa e il kernel libera le risorse in modo che altri processi possano usarle, in pratica libera la RAM occupata ...
Bene, poiché non è interessante avere questo tipo di processi zombi, sebbene non siano così frequenti, possiamo cercarli ed eliminarli come indicato qui. La prima cosa è scoprire se ci sono processi zombie nella nostra distribuzione e per questo possiamo aiutare noi stessi strumenti come top o come ps. Ad esempio, una di queste due opzioni:
ps -el | grep 'Z' ps aux | grep defunct
E una volta rilevato, possiamo Uccidilo direttamente con:
kill -HUP `ps -A -ostat,ppid,pid,cmd | grep -e ‘^[Zz]’ | awk ‘{print $2}’`
Sebbene un'altra alternativa sia trovare i processi padre, dal momento che a uccidere un processo zombie Devi uccidere i processi genitore che lo sostengono, come potresti aver dedotto:
ps -eo pid,ppid | grep <PID> kill -9 <PPID>
Dovrai sostituire dall'ID del processo zombie che hai trovato e per ucciderlo con kill, usa l'ID del processo genitore sostituendolo nell'esempio, ovviamente.
Buon sito!
Ci tirano sempre fuori dai guai.
Dove dice:
Sebbene un'altra alternativa sia trovare i processi padre, poiché per uccidere un processo zombi devi uccidere i processi padre che lo supportano, come potresti aver dedotto:
1 | ps -eo pid, ppid | grep
2|
3 | uccidere -9
Dovrai sostituire l'ID del processo zombie che hai trovato e per ucciderlo con kill, usa l'ID del processo genitore sostituendo nell'esempio, ovviamente.
puoi aggiungere lo script:
$ gatto killppid.sh
#! / Bin / bash
kill -9 $ (ps -eo pid, ppid | awk '$ 1 ==' $ {1} '{print $ 2}')
Naturalmente, non è un compito che un utente normale svolge sempre.
Sarebbe utile solo per l'amministratore, ma è pericoloso eseguirlo come root, perché può uccidere qualsiasi processo sul sistema.
In man kill ha questa nota:
NOTE La tua shell (interprete della riga di comando) potrebbe avere un comando kill integrato. Potresti
è necessario eseguire il comando descritto qui come /bin/kill per risolvere il conflitto.
Bash ha quel comando, questa è la parte di man bash a riguardo:
kill [-s sigspec | -n signum | -sigspec] [pid | specifica del lavoro] ...
kill -l | -L [sigspec | stato_uscita]
Invia il segnale denominato da sigspec o signum ai processi denominati da pid o job
spec. sigspec è un nome di segnale senza distinzione tra maiuscole e minuscole come SIGKILL (con o
senza il prefisso SIG) o un numero di segnale; signum è un numero di segnale. Se
sigspec non è presente, quindi si assume SIGTERM. Un argomento di -l elenca il
nomi dei segnali. Se vengono forniti argomenti quando viene fornito -l, i nomi dei
vengono elencati i segnali corrispondenti agli argomenti e lo stato di ritorno è 0.
L'argomento exit_status a -l è un numero che specifica un numero di segnale o
lo stato di uscita di un processo terminato da un segnale. L'opzione -L è equivalente
prestato a -l. kill restituisce true se almeno un segnale è stato inviato con successo, oppure
false se si verifica un errore o se viene rilevata un'opzione non valida.
All'inizio spiegano come bash protegge i processi, per evitare alcuni problemi, ma non mi è chiaro come potrei fare uno script sicuro da eseguire come root.
L'unica cosa che mi viene in mente è di proteggerlo in questo modo:
$ gatto killppid.sh
#! / Bin / bash
if [$ UTENTE == "radice"]
then echo Non eseguire $ 0 come root !!! è pericoloso!
exit
fi
kill -9 $ (ps -eo pid, ppid | awk '$ 1 ==' $ {1} '{print $ 2}')
$
Usa kill di bash, non / bin / kill
Come puoi vedere che non sono molto esperto di bash.
Sai come scrivere uno script sicuro che viene eseguito come utente del processo figlio, anche se viene eseguito come root?
qualcosa di equivalente a ciò che verrebbe fatto manualmente in questo modo:
$ su;
$ kill -9 $ (ps -eo pid, ppid | awk '$ 1 ==' $ {1} '{print $ 2}')