Buon Halloween Open SOURCE-rers!
Ecco una storia vecchia come epoca tempo. Da quando c'è stato C e Unix e (in seguito) Linux, abbiamo avuto zombi . In particolare, ci sono processi che vengono contrassegnati come processi zombie . Incompreso da alcuni, ignorato da altri e immune agli sforzi di tanti di noi che cercano di kill
questi processi senza molto successo. Perché?
Cos'è un processo in Linux?
Tutto inizia quando un programma in Linux viene eseguito e, quando lo fa, la sua istanza in esecuzione viene chiamata processo. Puoi vedere tutti i processi nel tuo ambiente Linux con il ps
comando.
$ ps -ax
PID TTY STAT TIME COMMAND
1 ? Ss 0:01 /usr/lib/systemd/systemd rhgb --switched-root --sys
2 ? S 0:00 [kthreadd]
3 ? I< 0:00 [rcu_gp]
4 ? I< 0:00 [rcu_par_gp]
A volte un processo avvia un altro processo, rendendo il primo processo padre del secondo. Il pstree
command è un ottimo strumento che ti consente di vedere la "genealogia" dei processi sul tuo sistema.
$ pstree -psn
systemd(1)─┬─systemd-journal(952)
├─systemd-udevd(963)
├─systemd-oomd(1137)
├─systemd-resolve(1138)
├─systemd-userdbd(1139)─┬─systemd-userwor(12707)
│ ├─systemd-userwor(12714)
│ └─systemd-userwor(12715)
├─auditd(1140)───{auditd}(1141)
├─dbus-broker-lau(1164)───dbus-broker(1165)
├─avahi-daemon(1166)───avahi-daemon(1196)
├─bluetoothd(1167)
A ogni processo viene assegnato un numero nel sistema. L'ID del processo numero 1 viene assegnato al primo processo eseguito durante il processo di avvio e ogni processo successivo dopo il PID 1 ne è un discendente. Il processo PID 1 è init , che nella maggior parte delle versioni più recenti di Linux è solo un collegamento simbolico a systemd
programma.
Più risorse Linux
- Comandi Linux cheat sheet
- Cheat sheet sui comandi avanzati di Linux
- Corso online gratuito:Panoramica tecnica RHEL
- Cheat sheet della rete Linux
- Cheat sheet di SELinux
- Cheat sheet dei comandi comuni di Linux
- Cosa sono i container Linux?
- I nostri ultimi articoli su Linux
Chiudere un processo con il comando kill
Puoi terminare i processi in un sistema Linux con kill
comando . Nonostante il nome, il kill
comando e una serie di altri come pkill
e killall
è stato scritto/progettato per inviare SEGNALI a uno o più processi. Quando non specificato, il SEGNALE predefinito che invia è il segnale SIGTERM per terminare il processo.
Quando un processo genitore muore o viene ucciso e il suo processo figlio non segue la morte del genitore, chiamiamo quel processo un processo orfano .
Come uccidere un processo zombi
I processi zombi, d'altra parte, non possono essere uccisi! Perché potresti chiedere? Bene, perché sono già morti!
Ogni processo figlio, una volta terminato, diventa un processo zombie e quindi rimosso dal genitore. Quando il processo esce dalla sua esistenza e rilascia le risorse che aveva utilizzato, il suo nome è ancora nella tabella dei processi del sistema operativo. È quindi compito del processo del genitore rimuovere il suo nome dalla tabella del processo. Quando ciò fallisce, abbiamo il processo zombie, che non è più un processo, ma solo una voce nella tabella dei processi del sistema operativo.
Questo è il motivo per cui provare a fare un kill
comando anche con -9
L'opzione (SIGKILL) su un processo defunto (zombie) non funziona, perché non c'è nulla da uccidere.
Quindi, per uccidere un processo zombi, come per rimuovere il suo nome dall'elenco dei processi (la tabella dei processi), devi uccidere il suo genitore. Ad esempio, se il PID 5878 è un processo zombi e il suo genitore è PID 4809, per uccidere lo zombi (5878) devi terminare il genitore (4809):
$ sudo kill -9 4809 #4809 is the parent, not the zombie
La mia ultima parola di avvertimento sugli zombi. Fai molta attenzione quando uccidi i processi padre. Se il genitore di un processo è PID 1 e lo uccidi, ti riavvierai!
E quella sarà una storia ancora più spaventosa da raccontare!