Come uccidere un processo che non può essere ucciso senza riavviare?


11

Esistono 5 processi che non possono essere eliminati kill -9 $PIDe l'esecuzione cat /proc/$PID/cmdlinebloccherà la sessione corrente. Forse sono processi di zombi.

L'esecuzione ps -ef or htopbloccherà anche la sessione corrente. Ma tope ps -estanno lavorando bene.

Quindi sembra che ci siano due problemi che il filesystem non risponde.

Questa è una macchina di produzione che esegue macchine virtuali, quindi il riavvio non è un'opzione.

I seguenti ID processi non funzionano: 16181 16765 5985 7427 7547

Il genitore di questi processi è init

        ├─collectd(16765)─┬─{collectd}(16776)
        │                 ├─{collectd}(16777)
        │                 ├─{collectd}(16778)
        │                 ├─{collectd}(16779)
        │                 ├─{collectd}(16780)
        │                 └─{collectd}(16781)
        ├─collectd(28642)───{collectd}(28650)
        ├─collectd(29868)─┬─{collectd}(29873)
        │                 ├─{collectd}(29874)
        │                 ├─{collectd}(29875)
        │                 └─{collectd}(29876)

E uno dei processi qemu non funziona

|-qemu-system-x86(16181)-+-{qemu-system-x86}(16232)
|                        |-{qemu-system-x86}(16238)
|                        |-{qemu-system-x86}(16803)
|                        |-{qemu-system-x86}(17990)
|                        |-{qemu-system-x86}(17991)
|                        |-{qemu-system-x86}(17992)
|                        |-{qemu-system-x86}(18062)
|                        |-{qemu-system-x86}(18066)
|                        |-{qemu-system-x86}(18072)
|                        |-{qemu-system-x86}(18073)
|                        |-{qemu-system-x86}(18074)
|                        |-{qemu-system-x86}(18078)
|                        |-{qemu-system-x86}(18079)
|                        |-{qemu-system-x86}(18086)
|                        |-{qemu-system-x86}(18088)
|                        |-{qemu-system-x86}(18092)
|                        |-{qemu-system-x86}(18107)
|                        |-{qemu-system-x86}(18108)
|                        |-{qemu-system-x86}(18111)
|                        |-{qemu-system-x86}(18113)
|                        |-{qemu-system-x86}(18114)
|                        |-{qemu-system-x86}(18119)
|                        |-{qemu-system-x86}(23147)
|                        `-{qemu-system-x86}(27051)

1
I processi di zombi non dovrebbero causare problemi. Se il numero di processi Zombie è così grande che supera il limite di processo sul server, ciò causerà un problema.
Raza,

@Salton: Non possiamo usare ps -ef e htop, quindi abbiamo qualche problema, forse quello che stiamo vedendo non è chiamato processo zombi?
Sam Stoelinga,

1
Puoi provare a rintracciarlo usando /usr/bin/strace ps -efper vedere esattamente dove ps -efpende.
Raza,

2
Come hai determinato che questi sono zombi? Sembra piuttosto un processo sospeso. Funziona ps -ele in quale stato si trovano questi processi?
Nils,

Alla fine il client ha comunque deciso di riavviare la macchina poiché i problemi stavano peggiorando. Grazie per tutti gli input. Ho imparato molto sugli zombi e sui processi ininterrotti.
Sam Stoelinga,

Risposte:


22

Non hai zombi. cat /proc/$PID/cmdlinenon avrebbe alcun problema con uno zombi. Se kill -9non uccide il programma , significa che il programma sta eseguendo un'operazione I / O ininterrotta. Questo di solito indica una delle tre cose:

  • un filesystem di rete che non risponde;
  • un bug del kernel;
  • un bug hardware.

Utilità come pspotrebbero bloccarsi se provano a leggere alcune informazioni come il percorso eseguibile del processo che il kernel non fornisce per uno dei motivi sopra.

Prova cat /proc/16181/syscalla vedere quale processo sta facendo 16181. Questo potrebbe funzionare o meno in base alla distanza del sistema.

Se il problema è un filesystem di rete, potresti essere in grado di smontarlo forzatamente o renderlo online. Se il problema è un bug del kernel o dell'hardware, ciò che puoi fare dipenderà dalla natura del bug. Il riavvio (e l'aggiornamento a un kernel fisso o la sostituzione dell'hardware danneggiato) è fortemente raccomandato.


Il gatto non risponde mai. Non penso che questo sia un bug. penso che sia una "caratteristica".
Gufo

7

Le altre risposte presuppongono che si tratti di processi di zombi. Un processo zombie è un processo che ha terminato l'esecuzione, ma è ancora nella tabella dei processi nel caso in cui il genitore voglia conoscere lo stato di uscita. Questi sono normali e initripuliranno automaticamente i processi di zombi che gli vengono assegnati.

I processi di zombi non dovrebbero mai far bloccare nulla, quindi potrebbe non essere il tuo problema. Se si tratta di una chiamata di sistema o di un driver in sospeso, il processo potrebbe essere in uno stato ininterrotto. C'è una buona spiegazione qui .


Troppi processi di zombi possono impedire il forksuccesso (quando nrpocviene raggiunta la difficoltà ) perché occupano ancora spazio nella tabella dei processi.
dhchdhd,

2

Per trovare i processi di zombi su Linux:

$ ps axo stat, ppid, pid, comm | grep -w defunto

Z 555 10242 Damn-Zombie <defunto>

Innanzitutto, puoi provare a inviare il segnale SIGCHLD al processo genitore dello zombi usando il comando kill. Nota che il comando sopra ti dà PPID (PID del processo genitore) di ogni zombi. Nel nostro esempio, PPID dello zombi è 555.

$ sudo kill -s SIGCHLD 555

Se un processo di zombi non scompare, puoi uccidere il processo genitore (ad es. 555) dello zombi.

$ sudo kill -9 555

Una volta ucciso il suo processo genitore, lo zombi verrà adottato dal processo init, che è genitore di tutti i processi in Linux. Il processo di init chiama periodicamente wait()per raccogliere qualsiasi processo di zombi.


Questa è la vera risposta Uccidere il genitore ha funzionato, grazie.
Andrew,

1

Puoi uccidere uno zombi solo uccidendo il suo genitore. Un processo di zombi ha rilasciato tutte le sue risorse e sta aspettando che il suo stato di uscita venga rilevato dal suo genitore. Diventa uno zombi quando il genitore non esegue un waitper raccogliere lo stato di uscita dal proprio figlio. Quando uccidi il genitore dello zombi, initprende lo stato di uscita e lo zombi muore finalmente.


Quindi vuoi che uccida init? Non è chiaro dalla domanda scusa hehe ma il genitore sembra essere init :( Ho modificato la domanda.
Sam Stoelinga,

4
No, vogliamo che tu non provi a uccidere lo zombi. Non puoi uccidere uno zombi. Questa FAQ è vecchia quanto lo stesso Unix.
Tripleee

@tripleee: Sì, questo è quello che ho capito. Forse quello che sto avendo non è uno zombi. htop non funziona e cat / proc / $ pid / cmdline o ls / proc / $ pid / inoltre non funziona. Normalmente questo non accade con gli zombi, ecco perché l'ho chiesto qui, questo non è un problema comune. Ho controllato diverse risposte che ti dicono di uccidere il genitore, che è init nel mio caso o di riavviare.
Sam Stoelinga,

1
"Uccidi il genitore" è il modo di raccogliere uno zombi normale. Non puoi uccidere init. Se uno zombi viene riparato sotto init, non puoi ucciderlo.
Tripleee
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.