有没有一种方法可以调用子进程,以便像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
信号,将它们发送到其子进程,然后等待(来自Bash script kill background (grand)children on Ctrl+C),但是否有不修改子脚本的方法?
kill
只会杀死指定参数中的进程,而不是它们的子孙进程。 - Flimm