Назад | Перейти на главную страницу

Bash: запуск фоновой службы на время другого процесса

Я запускаю несколько автоматизированных скриптов. Для некоторых задач мне иногда требуется запускать эфемральную фоновую «службу». Например, я хочу настроить туннель 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).