Por que o PGID do meu filho não processa o PID do pai?

13

Portanto, continuo lendo em todos os lugares que esse comando deve finalizar 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 eu vi, parece que o PGID dos processos filhos deve ser o PID do pai, mas não é o caso no meu sistema.

No meu sistema, o PGID da criança é o mesmo que o PGID do script pai, que acaba sendo bash.

O que está acontecendo aqui? Os exemplos estavam errados ou o meu sistema está configurado de maneira diferente?

O que eu preciso alcançar é encerrar os processos filhos sem encerrar o pai, para que eu não queira enviar um sinal de interrupção ao PGID em que o pai está.

TCZ8
fonte

Respostas:

11

Eu acho que você quer dizer PGID, que significa Process Group ID .

Quando um processo é bifurcado, ele herda seu PGID de seu pai. O PGID muda quando um processo se torna um líder de grupo de processos e , em seguida, seu PGID é copiado do PID. A partir de então, o novo processo filho que ele gera e seus descendentes herdam esse PGID (a menos que eles iniciem novos grupos de processos por conta própria).

Em um shell com controle de trabalho, como a maioria dos shells interativos, cada trabalho é colocado em seu próprio grupo de processos. Se você executar um script de shell, o processo de shell executando o script será o líder do grupo e o PGID será igual ao seu PID.

Em um shell sem controle de trabalho, como a maioria dos shells usados ​​para executar scripts, os comandos são executados no grupo de processos do shell.

A sintaxe kill -- -Nmata 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, pois esse é o PGID. Isto é essencialmente como o shell

kill %jobid

sintaxe funciona - traduz internamente %jobidpara 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. Consulte Como definir o grupo de processos de um script de shell para obter algumas sugestões.

Barmar
fonte
Você está dizendo que um shell com ou sem controle de trabalho faz a mesma coisa?
TCZ8
1
Não. Um shell com controle de trabalho inicia um novo grupo de processos para cada trabalho. Um shell sem controle de trabalho não inicia um novo grupo de processos para cada trabalho, executa-os em seu próprio grupo de processos.
Barmar
uau .. eu não li direito da primeira vez. Então, acho que o que quero é ativar o controle do trabalho? Isso garantiria que os filhos tivessem um PGID correspondente ao PID do script pai? Ou cada criança receberá seu próprio PGID exclusivo?
TCZ8
Encontrei alguns documentos on-line sobre os controles de tarefas, vou passar por isso. Obrigado pela sua ajuda, Barmar.
TCZ8
1
Com o controle do trabalho, cada criança recebe seu próprio PGID. Sem controle de trabalho, eles herdam o PGID do pai. Mas o pai pode ter herdado sua PGID de seu pai, se não é um líder de grupo de processo.
Barmar