Eu executo o comando (Xorg & sleep 3; xeyes) &
para testar o Xorg e o agrupo em um único trabalho em segundo plano de subshell para facilitar o gerenciamento. Isso funciona corretamente e abre xeyes na nova sessão do Xorg após 3 segundos.
Ao executar o comando, obterei uma saída como a seguinte:
[1] 635
Depois de executar ps -ef
para verificar novos processos, obterei uma saída como a seguinte:
root 635 361 0 4:52 tty1 00:00:00 -bash
root 636 365 0 4:52 tty2 00:00:00 /usr/lib/Xorg
root 639 365 0 4:52 tty1 00:00:00 xeyes
Esta parece ser uma saída bastante padrão e como esperado. Depois de verificar que meu servidor X funciona conforme o esperado, tento matar este grupo com kill %1
. Ao executar isso, meus processos agora ficam assim:
root 636 1 0 4:52 tty2 00:00:00 /usr/lib/Xorg
Por que o Xorg não conseguiu sair? Por que o subshell saiu com sucesso, fechando o xeyes corretamente, mas não trouxe o Xorg junto com ele? Por que o processo pai do Xorg agora mudou para 1 em vez do subshell? O subshell não deveria enviar um sinal de kill para todos os seus processos filhos ao sair?
Além disso, se eu matar o grupo com kill 635
, que muitos recursos dizem que deve ser equivalente a kill %1
, meu estado de processo é ainda mais bizarro:
root 636 1 0 4:52 tty2 00:00:00 /usr/lib/Xorg
root 639 1 0 4:52 tty1 00:00:00 xeyes
O que??? Por que ambos os processos falharam ao sair agora e agora são filhos do PID 1? O que está acontecendo aqui, e o que estou fazendo de errado?
Uma explicação detalhada do que exatamente está acontecendo aqui seria apreciada, além de apenas me dizer o que fazer.
Se você quiser observar o controle do trabalho, use a
-j
opçãops
que listará o ID do grupo de processos e o ID da sessão.Aqui, eu vejo:
Você vê
Xorg
é um filho dexeyes
como meu shell é um pouco mais otimizadobash
e é executadoxeyes
no processo do subshell, pois é o último comando do subshell. E não, um subshell não matará seus filhos quando terminar, isso tornaria o shell inutilizável (e aqui é óbvio que não poderia, pois o subshell foi substituído porxeyes
).O mesmo em
bash
:Existe um processo extra inútil
bash
que apenas esperaxeyes
terminar e não fará nada depois, mas caso contrário é o mesmo que emzsh
, você vê que um novo grupo de processos foi criado pelo shell (6825 forzsh
,7246
forbash
), masXorg
não é nesse grupo de processos.Isso não é por causa do
&
afterXorg
, comandos iniciados em um subshell não são iniciados em um novo trabalho, é porqueXorg
ele próprio inicia uma sessão totalmente nova (muito menos um grupo de processos) para anexar esse terminal tty2.Então, como
Xorg
se removeu do grupo de processos, fazer issokill %1
não o matará.Observe que
kill %1
envia um sinal SIGTERM para o grupo de processos do trabalho , não para um pid individual. Para enviar um sinal para um grupo de processos, você precisa:O que no meu caso acima teria matado os pids 7246 (bash subshell) e 7274 (
xeyes
), mas nãoXorg
(7247), pois não está no grupo de processos 7246.