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
forkpara executar o comando de segundo planocat <( sleep 100 & wait )em um filho (14247).- O filho (14247) chama
pipepara criar um canal e, em seguida,forkpara criar um filho para executar a substituição de processosleep 100 & wait.- O neto (14248) chama
forkpara executarsleep 100no 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 quesleepsaia.
- 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,execvepara 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,
catexits - seja porque você o matou ou porquesleepretorna e fecha o canal, entãocatvê 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?