Listar IDs de processos filhos

Oct 02 2020

Desejo obter uma lista de todos os IDs de processo filho para um determinado ID de processo pai ( 6330 qemu) para usar em um bashscript.

Posso vê-los htop, por exemplo:

Os principais resultados da pesquisa incluem:

# pgrep -P 6330
(no output)

# ps --ppid 6330
  PID TTY          TIME CMD

# pstree -p 6330
qemu(6330)-+-{qemu}(6332)
           |-{qemu}(6333)
           |-{qemu}(6340)
           |-{qemu}(6342)
           |-{qemu}(6343)
           `-{qemu}(6344)

... a saída deles é a mesma se executada como rootou como o usuário que possui qemu.

A pstreesaída pode ser trabalhada como último recurso, mas eu preferiria não analisá-la se puder evitar.

Além disso ... ps aux | grep 6332e pgrep 6332não rende nada ... então isso também é um pouco confuso.

Isso deve ser fácil, certo?

Eu aprecio seu tempo.

Respostas

2 KamilMaciorowski Oct 02 2020 at 10:35

Desejo obter uma lista de todos os IDs de processo filho para um determinado ID de processo pai ( 6330 qemu) para usar em um bashscript.

A solução para esse problema exato é pgrep -P 6330, mas o resto da pergunta sugere que talvez "IDs de processo filho" não sejam o que você realmente deseja.

Você usou pgrep -P 6330e a saída estava vazia porque não havia processos filho. O que htope pstreemostrou que eram tópicos . Então, talvez você realmente queira IDs de thread.

Veja estes:

  • Por que há muitos processos listados sob o mesmo título em htop?

    htopmostra threads individuais como processos separados por padrão, da mesma forma que ps -ALfaria. Se você pressionar maiúsculas, Hele mudará para mostrar apenas os processos principais (pressioná-lo novamente muda para trás).

  • man 1 pstree:

    Threads filhos de um processo são encontrados sob o processo pai e são mostrados com o nome do processo entre chaves [...]

  • Os threads são implementados como processos no Linux?

    O Linux costumava atribuir diferentes PIDs a threads. Como o Linux 2.4, os threads de um processo compartilham seu PID; isso é para satisfazer POSIX. A terminologia ficou mais complicada, "PID" é um pouco ambíguo. De uma resposta relevante no SO :

    A primeira e mais importante coisa a perceber é que "PID" significa coisas diferentes no espaço do kernel e no espaço do usuário. O que o kernel chama de PIDs são, na verdade, ids de thread em nível de kernel (freqüentemente chamados de TIDs), […]. Cada thread no sistema, seja no mesmo processo ou em um diferente, tem um único TID (ou "PID" na terminologia do kernel).

    O que é considerado um PID no sentido POSIX de "processo", por outro lado, é chamado de "ID de grupo de encadeamentos" ou "TGID" no kernel. Cada processo consiste em um ou mais threads (processos kernel), cada um com seu próprio TID (kernel PID), mas todos compartilhando o mesmo TGID, que é igual ao TID (kernel PID) do thread inicial em que o principal é executado.

    Quando topmostra threads, está mostrando TIDs (kernel PIDs), não PIDs (kernel TGIDs), e é por isso que cada thread tem um separado.

    A última frase se aplica a htopou pstreetambém.

Se você ainda quer receber estes diferentes IDs ( 6332, 6333...) para usar em um shell script, invocar esta:

ps -o lwp= -Lp 6330

O comando não é portátil, pode ou não funcionar no seu sistema operacional. Se funcionar, você pode excluir o tópico principal:

ps -o lwp= -Lp 6330 | grep -v '^ *6330$'

( <space>*porque ps(pelo menos meu ps) adiciona espaços à esquerda).