
Então continuo lendo em todos os lugares que este comando deve encerrar todos os processos filhos do processo pai:
kill -- -$$
Usar um ID negativo com o comando kill faz referência a um PGID e pelos exemplos que vi parece que o PGID dos processos filhos deveria ser o PID do pai, mas não é o caso no meu sistema.
No meu sistema, o PGID do filho é igual ao PGID do script pai, que acaba sendo bash.
O que está acontecendo aqui? Os exemplos estavam errados ou meu sistema está configurado de forma diferente?
O que preciso conseguir é encerrar os processos filhos sem encerrar o pai, para não querer enviar um sinal de eliminação para o PGID em que o pai está.
Responder1
Quando um processo é bifurcado, ele herda o PGID de seu pai. O PGID muda quando um processo se torna umlíder do grupo de processos, então seu PGID será copiado de seu PID. A partir de então, o novo processo filho gerado e seus descendentes herdam esse PGID (a menos que iniciem seus próprios grupos de processos).
Em um shell com controle de tarefas, como a maioria dos shells interativos, cada tarefa é colocada em seu próprio grupo de processos. Se você executar um script shell, o processo shell que executa o script será o líder do grupo e o PGID será igual ao seu PID.
Em um shell sem controle de tarefa, como a maioria dos shells usados para executar scripts, os comandos são executados no grupo de processos do shell.
A sintaxe kill -- -N
mata todos os processos do grupo com PGID = N. Você não pode usá-la com um PID arbitrário, apenas o PID de um líder de grupo de processos, já que esse é o PGID. É essencialmente assim que o shell
kill %jobid
a sintaxe funciona - ela é traduzida internamente %jobid
para o PGID do trabalho e envia o sinal para esse PGID.
Não há uma maneira simples de executar um script em seu próprio grupo de processos a partir de outro script de shell. VerComo definir o grupo de processos de um script de shellpara algumas sugestões, no entanto.