我有这个 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 的数组列表,并在任何子进程退出时进行陷阱,然后陷阱处理程序将杀死所有子进程。