Bash: executando um serviço em segundo plano pela duração de outro processo

1

Estou executando alguns scripts automatizados. Para algumas tarefas, às vezes preciso de um "serviço" de fundo epemral para ser executado. Por exemplo, eu quero configurar um túnel ssh, executar um teste e depois remover o túnel.

ATM Estou usando um código longo:

#!/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

Eu não gosto muito dessa solução, porque acho que a limpeza é chamada apenas quando o script inteiro sai, não apenas "automated_task". Eu realmente gostaria de ter o código tão local quanto possível. O que eu realmente gostaria de fazer é especificar, de alguma forma, que um processo em segundo plano seja executado apenas enquanto o processo em primeiro plano ainda estiver em execução.

    
por eshalev 31.05.2016 / 13:52

1 resposta

0

Eu tentaria armazenar o ID do processo filho conforme indicado aqui

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

Você pode usar ssh -O exit some_server em vez de kill, dependendo de usar ControlMaster setup. (veja ssh docs).

    
por 20.08.2017 / 20:34