如果某个 pid 终止,如何杀死已知正在运行的 pid?

如果某个 pid 终止,如何杀死已知正在运行的 pid?

我有这个 script.sh,我在其中传递二进制文件的路径,所有应用程序都在后台运行:

./script.sh path/to/app_1 path/to/app_2 ... path/to/app_n

这是脚本:

#!/bin/bash

for app in "$@"
do
    $app &
done

我的所有应用程序都按我的预期运行。其中一些只是没有窗口的控制台应用程序,但有些应用程序有界面,我可以关闭窗口应用程序。

我可以获得应用程序的 pid,如下所示:

pgrep "${app##*/}"

如何通过我通过 script.bash 作为参数传递的 pid 杀死所有应用程序?当我关闭其中一个窗口时,它应该杀死所有已知正在运行的应用程序。

答案1

这应该有效。

declare -a _procid

_kill_them_all()
{
    for p in ${_procid[@]} ; do
        kill -9 $p 2>/dev/null
    done
    exit
}

trap _kill_them_all SIGCHLD

for app in "$@"
do
    $app  &
    _procid+=($!)
done

wait ${_procid[@]}

echo "doesn't get here if there were children"

bash 脚本保留子 pid 的数组列表,并在任何子进程退出时进行陷阱,然后陷阱处理程序将杀死所有子进程。

相关内容