Я запускаю несколько автоматизированных скриптов. Для некоторых задач мне иногда требуется запускать эфемральную фоновую «службу». Например, я хочу настроить туннель ssh, запустить тест, а затем удалить туннель.
Банкомат Я использую длинный код:
#!/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
Мне не очень нравится это решение, потому что я думаю, что очистка вызывается только после выхода всего скрипта, а не только «automatic_task». Мне бы очень хотелось, чтобы код был как можно более локальным. Что я действительно хотел бы сделать, так это как-то указать, что фоновый процесс запускается только до тех пор, пока процесс переднего плана все еще выполняется.
Я бы попытался сохранить идентификатор дочернего процесса, как указано Вот
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
настроить. (см. документацию по ssh).