Como mover um processo de um grupo de processos para outro e como listar os processos em cada grupo de processos?

4

Com base no que aprendi até agora, um terminal tem apenas uma sessão e uma sessão tem um ou mais grupos de processos, e um grupo de processos tem um ou mais processos.

A imagem a seguir ilustra isso:

Eu tenho duas perguntas:

  1. Como mover um processo de um grupo de processos para outro?
  2. Como listar os processos em cada grupo de processos?

Editar: quero dizer como fazer essas duas coisas a partir do terminal e não de forma programática.

    
por user259392 07.11.2017 / 23:14

1 resposta

3

Da perspectiva de um usuário ou de um programador típico, você não move processos de um grupo para outro. Organizar grupos de processos é o trabalho do shell. Quando você executa um trabalho interativamente, o shell o coloca em seu próprio grupo. A intenção principal de fazer isso é matar todo o grupo (por exemplo, todos os processos em um pipeline) quando o usuário pressiona Ctrl + C .

Mais geralmente, a única coisa que é possível por grupos de processos é matar atomicamente um conjunto de processos. Se você tentar listar alguns processos e, em seguida, matá-los, um deles pode ter bifurcado entre eles. Quando você mata um grupo de processos, isso mata todos os processos do grupo, mesmo que eles estejam ocupados, bifurcando-se.

A única coisa que às vezes você pode querer fazer como um usuário ou programador de aplicativos é executar um novo processo em seu próprio grupo. Não há comando no nível do usuário para fazer exatamente isso. Você pode fazer isso iniciando um shell interativo. (Veja Tempo limite em um script de shell para um exemplo complexo.) Existem outros comandos, como o timeout utility do GNU coreutils e o Linux e o setsid utility da suíte util-linux que cria um novo processo grupo como parte de sua apresentação.

A chamada do sistema para mover um processo para um grupo de processos diferente é setpgid . (Há também um alias parcial chamado setpgrp .) Existem restrições: ele pode ser chamado apenas pelo próprio processo ou por seu pai, e o grupo-alvo deve estar na mesma sessão que o grupo original. Você não pode mover arbitrariamente um processo de um grupo para outro.

Não há uma maneira específica de enumerar os processos em um grupo. Tudo o que você pode fazer é enumerar todos os processos e selecionar os que estão nesse grupo específico. Você pode listar grupos de processos na saída ps incluindo a coluna pgid (por exemplo, ps -e -o pid,ppid,pgid,args ).

    
por 07.11.2017 / 23:41