Bash:在另一个进程持续运行期间运行后台服务

Bash:在另一个进程持续运行期间运行后台服务

我正在运行一些自动化脚本。对于某些任务,我有时需要运行一个临时的后台“服务”。例如,我想设置一个 ssh 隧道,运行测试,然后删除该隧道。

ATM 我正在​​使用一些冗长的代码:

#!/usr/bin/env bash
function automated_task(){
    socksProxyTimeout=120
    ssh -A -D 9999 some_server "sleep $socksProxyTimeout; " &
    sockProxyPid=$!
    sleep 3

    function cleanUp(){
        echo shutting down background processes...
        kill -9 $sockProxyPid || true
        cd ../../
    }

    trap 'cleanUp' EXIT
    run_selenium_with_proxy
}
automated_task

我不太喜欢这个解决方案,因为我认为只有在整个脚本退出时才会调用 cleanup,而不仅仅是“automated_task”。我真的希望代码尽可能本地化。我真正想做的是以某种方式指定后台进程仅在前台进程仍在运行时运行。

答案1

我会尝试存储子进程 ID,如下所示这里

sshPID=""

disconnect() 
   if [ "x$sshPID" != "x" ]; then
       kill "$sshPID"
       sshPID=""
   fi
}

connect() {
    ssh -A -D 9999 some_server "sleep $socksProxyTimeout; " & sshPID=$!
    trap 'disconnect' EXIT
}

connect
sleep 3
disconnect

您可能可以使用ssh -O exit some_server而不是 kill,这取决于您是否使用ControlMastersetup。(参见 ssh 文档)。

相关内容