Как вы завершаете все процессы, вызываемые файлом оболочки

Хорошо, у меня есть дилемма, на которую я смотрел слишком долго. Я пробовал большинство онлайн-решений, но они не очень хорошо работали ...

У меня есть файл оболочки. Давайте назовем это «а». «а» выглядит примерно так:

#a.sh

sh b.sh &
sh c.sh &

b.sh и c.sh выглядят примерно так:

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

А затем c.sh:

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

Конечно, f.sh и e.sh похожи и запускают свои собственные процессы и прочее.

Теперь, как вы можете видеть, когда я запускаю «a.sh», он запускает множество других вещей. Я нажимаю Ctrl + C , и процессы все еще работают в фоновом режиме. Я закрываю терминал; то же самое. Я пытался убить с помощью ID, но я просто не знаю, как это сделать для многих программ с открытым исходным кодом, которые я использую. В частности, я, например, попробовал это предложение , но как я могу a.sh узнать, какие процессы выполняются в e.sh и так далее, чтобы он мог их убить? Я говорю вам, что это не сработало.

Есть ли команда, которая позволяет мне завершать все процессы, запускаемые файлом оболочки? Я знаю, что это , поэтому раздражает, но я не могу поделиться кодом на данный момент. Если вы действительно нуждаетесь во мне, я могу опубликовать что-то похожее, но, опять же, многое из того, что я делаю, - это запуск программного обеспечения, основанного на определенных условиях, и файлы программного обеспечения и оболочки не закрываются, когда я нажимаю Ctrl < / KBD> + С . Так что я вынужден pkill -U myuser, но это непрактично.

2
задан 1 December 2017 в 11:14

1 ответ

Если pstree $(pgrep a) перечисляет все процессы-потомки a, вы можете отправить SIGTERM всем из них (включая a.sh) с помощью:

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

Если это не так, и ни kill -$(pgrep a) (обратите внимание на -), ни pkill -P $(pgrep a) не могу помочь, я предлагаю вам добавить строку в начало сценариев и добавить свой PID в один файл, например:

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

Таким образом у вас всегда есть список PID, доступных для уничтожения простым:

kill </path/to/the/pidfile
2
ответ дан 1 December 2017 в 11:14

Другие вопросы по тегам:

Похожие вопросы: