Listar IDs de processos filhos
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
Desejo obter uma lista de todos os IDs de processo filho para um determinado ID de processo pai (
6330 qemu) para usar em umbashscript.
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 queps -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
htopoupstreetambé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).