有没有办法调用一个子进程,以便它和它的所有后代都被发送一个中断,就像你 Ctrl-C 一个前台任务一样?我试图杀死一个调用长期运行的孩子的启动器脚本。我已经尝试过kill -SIGINT $child
(它不会将中断发送给它的后代,所以是无操作的)和kill -SIGINT -$child
(它在交互调用时有效,但在脚本中运行时无效)。
这是一个测试脚本。长时间运行的脚本是test.sh --child
. 当您调用时test.sh --parent
,它会调用test.sh --child &
然后尝试杀死它。如何让父母成功杀死孩子?
#!/bin/bash
if [ "$1" = "--child" ]; then
sleep 1000
elif [ "$1" = "--parent" ]; then
"$0" --child &
for child in $(jobs -p); do
echo kill -SIGINT "-$child" && kill -SIGINT "-$child"
done
wait $(jobs -p)
else
echo "Must be invoked with --child or --parent."
fi
我知道您可以将长时间运行的子进程修改为trap
信号,将它们发送到其子进程,然后等待(从
Ctrl+C 上的 Bash 脚本杀死背景(大)子进程),但是有什么办法不修改子脚本?