Como criar uma árvore de processos?

5

Eu tenho um código que mata processos e seus filhos / netos. Eu quero testar esse código.

Atualmente, estou fazendo $ watch date > date.txt , o que cria um processo com um filho.

Existe alguma maneira de criar um pai - > criança - > neto árvore? Que comando pode fazer isso acontecer?

    
por Varun 05.10.2015 / 20:47

4 respostas

5
#!/bin/sh
#This is a process with an id of $$

( sleep 1000 )&               #this creates an idle child
( (sleep 1000)& sleep 1000 )& #this creates an idle child and grandchild
wait                          #this waits for direct children to finish

A execução do acima como ./1.sh & no meu sistema criou a seguinte árvore de processos:

$ command ps -o pid,ppid,pgrp,stat,args,wchan --forest
  PID  PPID  PGRP STAT COMMAND                     WCHAN
24949  4783 24949 Ss   /bin/bash                   wait
25153 24949 25153 S     \_ /bin/sh ./1.sh          sigsuspend
25155 25153 25153 S     |   \_ sleep 1000          hrtimer_nanosleep
25156 25153 25153 S     |   \_ sleep 1000          hrtimer_nanosleep
25158 25156 25153 S     |       \_ sleep 1000      hrtimer_nanosleep

Você pode notar que a árvore tem o mesmo grupo de processos ( PGRP ) de 25153, que é idêntico ao PID do primeiro processo. O shell cria um grupo de processos sempre que você inicia um novo comando no modo interativo (ou com o controle de trabalho ativado explicitamente).

O mecanismo PGRP permite que o shell envie um sinal para todo o grupo de processos de uma vez sem criar uma condição de corrida. Isso é usado para controle do trabalho e quando o script é executado e um trabalho em primeiro plano, para envio:

  • (SIG) INTR quando o usuário pressiona C-C
  • (SIG) SAIR quando o usuário pressiona C - \
  • (SIG) STP quando o usuário pressiona C-Z

Você pode fazer o mesmo fazendo, por exemplo:

kill -INTR -25153 

onde INTR é o sinal e 25153 é o grupo de processos para o qual você deseja enviar o sinal. O - antes do 25153 significa que você está segmentando um ID PGRP em vez de um PID .

No seu caso, o sinal que você deve enviar é -TERM (término da solicitação). O termo é o sinal padrão kill envia, no entanto, você precisa especificá-lo explicitamente se estiver segmentando um grupo em vez de um PID .

kill -TERM -25153

Se você quiser eliminar o grupo de processos do último trabalho em segundo plano iniciado, poderá fazer isso:

kill -TERM -$!
    
por 05.10.2015 / 21:16
2

Adicione uma chamada de shell

sh -c "watch date > date.txt"

Para mais níveis, adicione mais shells em torno de

    
por 05.10.2015 / 20:51
1

Você pode criar um script recursivo. por exemplo, no arquivo /tmp/run

#!/bin/bash
depth=${1:-3}
f(){
 let depth--
 if [ $depth -gt 0 ]
 then $0 $depth
 else sleep 999
 fi
}
f

, em seguida, chmod +x /tmp/run e /tmp/run 3 .

    
por 05.10.2015 / 21:12
0

O comando ps no freebsd não parece ser capaz de produzir uma árvore de processos. Felizmente existe um pacote chamado pstree que contém um programa que fará exatamente isso.

    
por 03.09.2016 / 07:08