Perché processo / programma diventa zombi?


13

Se lo script funziona correttamente dalla riga di comando, perché lo stesso script diventa stato zombi dopo aver eseguito cron e Come risolverai lo stesso?

Qui di seguito esempio reale:

[root@abc ~]# ps ax | grep Z
23880 ?        Zs     0:00 [checkloadadv.sh] <defunct>
23926 pts/0    S+     0:00 grep Z
[root@abc ~]# strace -p 23880
attach: ptrace(PTRACE_ATTACH, ...): Operation not permitted
[root@abc ~]# pstree | grep  checkload
init-+-crond---crond-+-checkloadadv.sh
[root@abc ~]# bash /usr/bin/checkloadadv.sh
System Load is OK : 0.05

La risoluzione dei problemi si verifica in caso di problemi. Gli zombi non sono un problema.
Gilles 'SO- smetti di essere malvagio' il

@Gilles, hai ragione, ma devo occuparmene e scoprire come prevenirli? cosa ne pensi ?
Rahul Patil,

Non sono problemi, quindi no, non devi preoccuparti.
Gilles 'SO- smetti di essere malvagio' il

Risposte:


21

inserisci qui la descrizione dell'immagine

Come gli zombi reali, un processo di zombi non può essere ucciso, perché è già morto.

Come succede

Quando in Linux / Unix un processo muore / termina tutte le informazioni dal processo vengono rimosse dalla memoria di sistema, rimane solo il descrittore di processo. Il processo entra nello stato Z (zombie). Il suo processo genitore riceve un segnale dal kernel:, SIGCHLDciò significa che uno dei suoi processi figlio esce, viene interrotto o riprende dopo essere stato interrotto (nel nostro caso semplicemente esce).

Il processo padre ora deve eseguire la wait()syscall per leggere lo stato di uscita e altre informazioni dal suo processo figlio. Quindi il descrittore viene rimosso dalla memoria e il processo non è più uno zombi.

Se il processo genitore non chiama mai il wait()syscall, il descrittore del processo zombi rimane nella memoria e mangia il cervello. Normalmente non vedi processi di zombi, perché la procedura sopra richiede meno tempo.

L'alba dei morti

Ogni descrittore di processo ha bisogno di una quantità molto piccola di memoria, quindi alcuni zombi non sono molto pericolosi (come nella vita reale). Un problema è che ogni processo di zombie mantiene il suo id di processo e un sistema operativo Linux / Unix ha un numero limitato di pid. Se un software programmato in modo errato genera molti processi zombi, può accadere che i processi non possano più essere avviati perché non sono più disponibili ID di processo.

Quindi, se fanno parte di grandi gruppi, sono molto pericolosi (come in molti film è dimostrato molto bene)

Come possiamo difenderci da un'orda di zombi?

Un colpo in testa avrebbe funzionato, ma non conosco il comando per quello (SIGKILL non funzionerà perché il processo è già morto).

Bene, puoi inviare SIGCHLD tramite kill al processo genitore, ma quando ignora questo segnale, e allora? La tua unica opzione è di uccidere il processo genitore e che il processo init "adotti" lo zombi. Init chiama periodicamente la wait()squallida per ripulire i suoi figli di zombi.

Nel tuo caso

Nel tuo caso, devi inviare SIGCHLD al processo crond:

root@host:~# strace -p $(pgrep cron)
Process 1180 attached - interrupt to quit

Quindi da un altro terminale:

root@host:~$ kill -17 $(pgrep cron)

L'output è:

restart_syscall(<... resuming interrupted call ...>) = ? ERESTART_RESTARTBLOCK (To be restarted)
--- SIGCHLD (Child exited) @ 0 (0) ---
wait4(-1, 0x7fff51be39dc, WNOHANG, NULL) = -1 ECHILD (No child processes) <-- Here it happens
rt_sigreturn(0xffffffffffffffff)        = -1 EINTR (Interrupted system call)
stat("/etc/localtime", {st_mode=S_IFREG|0644, st_size=1892, ...}) = 0
rt_sigprocmask(SIG_BLOCK, [CHLD], [], 8) = 0
rt_sigaction(SIGCHLD, NULL, {0x403170, [CHLD], SA_RESTORER|SA_RESTART, 0x7fd6a7e9d4a0}, 8) = 0
rt_sigprocmask(SIG_SETMASK, [], NULL, 8) = 0
nanosleep({42, 0}, ^C <unfinished ...>
Process 1180 detached

Vedete che la wait4()syscall restituisce -1 ECHILD, il che significa che non esiste alcun processo figlio. Quindi la conclusione è: cron reagisce al syscall SIGCHLD e non dovrebbe forzare l'apocalisse.


1
Cosa, niente mazze da cricket e LP?
Alessio,

-3

Se il thread padre viene ucciso prima del suo thread figlio, tutto il thread figlio diventerà processi zombi.


7
Non è vero, saranno semplicemente reinventati. I processi di zombi non avevano chiamato waitpid.
Chris Down

Forse stava parlando di processi genitore e figlio; un processo figlio diventa un "orfano" quando il suo genitore "muore".
Barun
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.