Como você finaliza todos os processos chamados por um arquivo shell

2

Ok, tenho um dilema que venho encarando há muito tempo. Eu tentei a maioria das soluções on-line, mas elas não funcionaram muito bem ...

Eu tenho um arquivo shell. Vamos chamá-lo "a". "a" parece muito com isso:

#a.sh

sh b.sh &
sh c.sh &

b.sh e c.sh são muito parecidos com isto:

#b.sh
run a process
run this opensource software over these files and wait
if condition; do
    sh e.sh
else
    f.sh
fi

e depois c.sh:

#c.sh
call some other programs
call some python files
call these shell files
... etc

É claro que f.sh e e.sh são semelhantes e executam seus próprios processos e outras coisas.

Agora, como você pode ver, quando eu executo o "a.sh", ele executa uma infinidade de outras coisas. Eu pressiono Ctrl + C , e os processos ainda estão sendo executados em segundo plano. Eu fecho o terminal; mesma coisa. Eu tentei matar com ID, mas eu não sei como fazer isso por muito do software de código aberto que estou usando. Especificamente, tentei, por exemplo, esta sugestão , mas como Eu faço a.sh conhecer os diferentes processos que estão sendo executados no e.sh e assim por diante, para matá-los? Não está funcionando, eu te digo.

Existe um comando que me permite finalizar todos os processos iniciados por um arquivo shell? Eu sei que isso é tão irritante, mas não posso compartilhar o código a partir de agora. Se você realmente precisa de mim, posso postar algo parecido, mas mais uma vez, muito do que estou fazendo é rodar software baseado em certas condições e o software e os arquivos de shell não fecham quando clico em Ctrl + C . Então, sou forçado a pkill -U myuser , mas isso é impraticável.

    
por John Lexus 01.12.2017 / 00:42

1 resposta

2

Se pstree $(pgrep a) listar todos os processos descendentes de a , você poderá enviar SIGTERM para todos eles (incluindo a.sh ) com:

kill $(pstree -p $(pgrep "a.sh") | awk -F"[)(]" '{for(i=2;i<=NF;i+=2)print $i}')

Se esse não é o caso e nem kill -$(pgrep a) (note que - ) nem pkill -P $(pgrep a) podem ajudar, sugiro que você adicione uma linha ao início dos scripts e anexe seu PID a um único arquivo como este:

echo $$ >>/path/to/the/pidfile

Desta forma, você sempre tem uma lista de PIDs disponíveis para matar de uma forma simples:

kill </path/to/the/pidfile
    
por dessert 02.12.2017 / 00:38