好吧,我有一个困扰我很久的难题。我尝试了大多数在线解决方案,但效果都不太好……
我有一个 shell 文件。我们把它命名为“a”。“a”看起来很像这样:
#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 等中正在运行的不同进程,以便可以终止它们?我告诉你,它一直不起作用。
有没有命令可以让我结束由 shell 文件启动的所有进程?我知道这是所以很烦人,但目前我无法分享代码。如果您真的需要我,我可以发布一些看起来类似的内容,但同样,我所做的很多事情都是根据某些条件运行软件,并且当我按下Ctrl+时软件和 shell 文件不会关闭C。所以我不得不这样做pkill -U myuser
,但这不切实际。
答案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