如何结束 shell 文件调用的所有进程

如何结束 shell 文件调用的所有进程

好吧,我有一个困扰我很久的难题。我尝试了大多数在线解决方案,但效果都不太好……

我有一个 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

相关内容