我想要一个bash函数来启动后台进程并设置一个陷阱以在退出时终止它。类似的东西:
function start {
<<<run process>>> &
local pid="$!"
trap "kill -9 $pid" EXIT
echo $pid
}
现在,如果我直接调用此函数,它可以工作,但如果我使用命令替换来存储pid供以后使用:
local pid=$(start)
然后显然这会启动另一个bash进程,并在函数返回后立即执行陷阱。
任何使这项工作的方法?
答案 0 :(得分:0)
如果我正确地阅读您的问题,您将在脚本退出时立即终止该过程。
这意味着该进程将与脚本一起终止,而不是阻止脚本直到子shell完成。
要解决这个问题,我建议您使用SIGINT和SIGTERM来终止进程,而不是依赖EXIT来终止进程。
例如:
#!/bin/bash
function start {
<<command>> &>/dev/null &
local pid="$!";
echo $pid;
trap "kill -9 $pid" SIGINT SIGTERM
}
PID=$(start)
echo $PID;
请注意。在执行之前,不要忘记关闭<<command>>
的任何输出。如果不这样做,这将与存储在$ PID中的PID输出混淆。如果你确实希望这个回显,请用1>&2
发送给stderr。
希望这有帮助。
答案 1 :(得分:0)
我终于找到了类似于@gniourf_gniourf在评论中建议的解决方案。另外,我想推迟多个清理操作,直到脚本退出,所以我创建了一个迭代这样的列表的单个陷阱:
exit_list=()
function on_exit {
for line in "${exit_list[@]}" ; do
$line
done
}
trap on_exit EXIT
start函数将PID存储在全局变量中(exit_list
数组也是全局变量):
function start {
<<<run process>>> &
pid="$!"
exit_list=("kill -9 $pid" "${exit_list[@]}")
}