O zumbi não está esperando por seu filho. Como qualquer processo de zumbi, ele fica por perto até que seu pai o colecione.
Você deve exibir todos os processos envolvidos para entender o que está acontecendo e também ver o PPID. Use esta linha de comando:
ps -t $(tty) -O ppid,pgid
O pai do processo que você está matando é cat
. O que acontece é que o bash executa o comando background cat <( sleep 100 & wait )
em um subshell. Como a única coisa que essa sub-rede faz é configurar um redirecionamento e, em seguida, executar um comando externo, essa sub-tampa é substituída pelo comando externo. Aqui está o resumo:
- O bash original (12126) chama
fork
para executar o comando de segundo planocat <( sleep 100 & wait )
em um filho (14247).- O filho (14247) chama
pipe
para criar um canal e, em seguida,fork
para criar um filho para executar a substituição de processosleep 100 & wait
.- O neto (14248) chama
fork
para executarsleep 100
no plano de fundo. Como o neto não é interativo, o processo em segundo plano não é executado em um grupo de processos separado. Em seguida, o neto espera quesleep
saia.
- O neto (14248) chama
- O filho (14247) chama
setpgid
(é um trabalho em segundo plano em um shell interativo para obter seu próprio grupo de processos) e, em seguida,execve
para executarcat
. (Estou um pouco surpreso que a substituição do processo não esteja acontecendo no grupo de processos em segundo plano.)
- O filho (14247) chama
- Você mata o neto (14248). Seu pai está executando
cat
, que não sabe nada sobre qualquer processo filho e não tem nenhum negócio chamandowait
. Como o pai do neto não colhe, o neto fica para trás como um zumbi. - Eventualmente,
cat
exits - seja porque você o matou ou porquesleep
retorna e fecha o canal, entãocat
vê o final de sua entrada. Nesse ponto, o pai do zumbi morre, então o zumbi é coletado pelo init e o init o colhe.
Se você alterar o comando para
{ cat <( sleep 100 & wait ); echo done; } &
, em seguida, cat
é executado em um processo separado, não no filho do processo bash original: o primeiro filho precisa ficar para trás para executar echo done
. Nesse caso, se você matar o neto, ele não ficará como um zumbi, porque o filho (que ainda está em execução nesse momento) colhe o resultado.
Veja também Como o Linux lida com o processo zumbi e > Um zumbi pode ter órfãos? As crianças órfãs serão perturbadas por colher o zumbi?