Хорошо, у меня есть дилемма, на которую я смотрел слишком долго. Я пробовал большинство онлайн-решений, но они не очень хорошо работали ...
У меня есть файл оболочки. Давайте назовем это «а». «а» выглядит примерно так:
#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 kbd> + C kbd>, и процессы все еще работают в фоновом режиме. Я закрываю терминал; то же самое. Я пытался убить с помощью ID, но я просто не знаю, как это сделать для многих программ с открытым исходным кодом, которые я использую. В частности, я, например, попробовал это предложение , но как я могу a.sh
узнать, какие процессы выполняются в e.sh и так далее, чтобы он мог их убить? Я говорю вам, что это не сработало.
Есть ли команда, которая позволяет мне завершать все процессы, запускаемые файлом оболочки? Я знаю, что это , поэтому раздражает, но я не могу поделиться кодом на данный момент. Если вы действительно нуждаетесь во мне, я могу опубликовать что-то похожее, но, опять же, многое из того, что я делаю, - это запуск программного обеспечения, основанного на определенных условиях, и файлы программного обеспечения и оболочки не закрываются, когда я нажимаю Ctrl < / KBD> + С KBD>. Так что я вынужден pkill -U myuser
, но это непрактично.
Если 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