我正在运行一些自动化脚本。对于某些任务,我有时需要运行一个临时的后台“服务”。例如,我想设置一个 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,这取决于您是否使用ControlMaster
setup。(参见 ssh 文档)。