Zombi a bash


11

Bash non sembra creare zombi. Sembra che i processi vengano immediatamente raccolti quando vengono uccisi.

Posso fare bash fare zombi?


Perché sto chiedendo:

Mi piacerebbe poter uccidere in sicurezza un processo figlio o kill -9farlo in modo sicuro se non muore entro un certo periodo di tempo, ma non voglio zappare accidentalmente un processo che non è il mio processo figlio. I processi di zombi di solito lo rendono molto semplice e sicuro per le condizioni di gara.


1
Forse un'altra idea ... se vuoi davvero proteggerti dall'uccisione di processi esterni, dai un'occhiata ai cgroups. Chiama unshareper creare uno spazio dei nomi PID, in modo che dall'interno dell'albero dei processi i processi esterni siano isolati e inaccessibili.
Orione,

Utilizzare il controllo del lavoro (come in, kill -KILL %ndove si ntrova il numero del lavoro e così via), invece di tentare di eluderlo.
Animale nominale

Ottima domanda! Un approccio alternativo al "perché lo chiedi", però: hai considerato il timeoutcomando?
Carattere jolly

Risposte:


13

Per fare un processo di zombi:

$ (sleep 1 & exec /bin/sleep 10)

Questo sostituisce la shell che gira sleep 1con /bin/sleep 10quella che non conoscerà il sleep 1processo terminato, creando così uno zombi per 10 secondi.


Non sono sicuro di cosa ti aspetti dall'uccidere un processo di zombi. Un processo di zombi era già morto, non puoi ucciderlo.

In realtà, puoi far scomparire i processi di zombi, ma uccidendo i suoi genitori, non i processi di zombi stessi.


I PID raccolti vengono riciclati. Il punto degli zombi è che riservano i PID fino a quando il genitore non riconosce la morte del proprio figlio aspettandolo. Senza questo, uccidere un pid può provocare una vittima accidentale.
PSkocik,

1
In C, puoi essere sicuro di non fare una vittima accidentale quando uccidi tuo figlio perché fino a quando non hai atteso quel bambino, il PID di quel bambino non può essere riciclato. Mi piacerebbe poter avere la stessa garanzia nella shell.
PSkocik,

3

Risposta non così interessante:

$ (A=$BASHPID && ( kill -STOP $A ))

[1]+  Stopped                 ( A=$BASHPID && ( kill -STOP $A ) )

$ ps -C bash
  PID TTY          TIME CMD
29453 pts/0    00:00:00 bash
29593 pts/0    00:00:00 bash
29594 pts/0    00:00:00 bash <defunct>

In che modo è un processo di zombi? Si è appena fermato. Inoltre $BASHPIDè $$credo.
Gabor Csardi,

$BASHPIDnon è lo stesso $$. Prova codice seguente: echo $$ $BASHPID ;echo $(echo $$ $BASHPID). Puoi trovare maggiori informazioni in man bash.
Alex Baranowski,
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.