Killing jobs started within functions

1

Estou tentando usar algumas funções em um script bash para simplificar a chamada de alguns processos filhos. Eu quero decidir no site de chamada se deve ou não executar o processo em segundo plano como um trabalho, ou em primeiro plano, e depois matar o processo filho quando necessário. Infelizmente, tanto quanto eu posso dizer, o pid que eu obtenho com $! não pertence ao processo de segundo plano de longa duração, mas à função que o chamou. Matando o pid eu recebo com $! não mata o processo filho de longa duração e parece ficar órfão.

function inner() {
  tail -f /dev/null
}

function outer() {
  inner
}

outer &
echo 'Before, $!: ' $!
echo 'Before, jobs -p: ' $(jobs -p)
echo 'Before, ps aux: ' $(ps aux | grep /dev/null | grep -v grep)

kill $!
echo 'After, $!: ' $!
echo 'After, jobs -p: ' $(jobs -p)
echo 'After, ps aux: ' $(ps aux | grep /dev/null | grep -v grep)

A saída que recebo é:

Before, $!:  71644
Before, jobs -p:  71644
Before, ps aux:  jstaab 71646 0.0 0.0 4267744 688 s005 S+ 2:53PM 0:00.00 tail -f /dev/null
After, $!:  71644
After, jobs -p:  71644
./test.sh: line 17: 71644 Terminated: 15          outer
After, ps aux:  jstaab 71646 0.4 0.0 4267744 688 s005 S+ 2:53PM 0:00.00 tail -f /dev/null

Você notará que ps aux me dá um pid diferente de $! ou jobs -p . Isso faz sentido, mas como posso matar tail -f /dev/null com um kill sem usar o comando?

    
por jstaab 27.03.2018 / 00:05

1 resposta

1

outer & cria uma subchave. $! fornece o PID deste subnível.

tail -f /dev/null é um filho desse subshell, então ele tem um PID diferente. Mas você pode fazer

exec tail -f /dev/null

em vez disso. Então o kill atinge o tail .

Outra possibilidade é usar /bin/kill em vez do shell embutido. Com um número negativo como argumento, você pode matar todo o grupo de processos:

/bin/kill -TERM -$!
    
por 27.03.2018 / 00:49