使用命令替换Bash EXIT陷阱

时间:2015-02-22 12:14:56

标签: bash

我想要一个bash函数来启动后台进程并设置一个陷阱以在退出时终止它。类似的东西:

function start {
    <<<run process>>> &
    local pid="$!"
    trap "kill -9 $pid" EXIT
    echo $pid
}

现在,如果我直接调用此函数,它可以工作,但如果我使用命令替换来存储pid供以后使用:

local pid=$(start)

然后显然这会启动另一个bash进程,并在函数返回后立即执行陷阱。

任何使这项工作的方法?

2 个答案:

答案 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[@]}")
}