Como faço para que o ssh seja executado em segundo plano sem usar -f?

3

Estou tentando criar um túnel ssh, transformá-lo em um processo em segundo plano e escrever um arquivo pid, que eu possa usar posteriormente para eliminá-lo. Eu posso executar ssh com -f , mas então eu não tenho um identificador em seu PID.

No entanto, quando eu tento executar o script abaixo via nohup ou setsid, o controle nunca é retornado ao shell do qual eu tento dememonizar o script.

#!/bin/sh                                                 

while getopts ":v" flag; do
    case $flag in
        v|verbose) verbose=1;;
        :) echo "option -$lastflag requires an argument"; exit 1;;
    esac 
    lastflag="$flag"
    shift $((OPTIND - 1)); OPTIND=1
done

ssh  -p '2222'  -nNL '5984:localhost:5984' '[email protected]' &
pid=$!
sleep 2;
ps -p $pid >/dev/null 2>&1 || exit 1
echo $pid > "var/couchdb-tunnel.pid"
wait

Invocação:

nohup script.sh
setsid script.sh

Como eu convenço o ssh (eu suponho) a deixar o terminal? Existe alguma outra maneira que eu possa realizar o que eu quero?

    
por vezult 28.02.2012 / 23:05

3 respostas

2

O shell interno que você está procurando é disown , que reanima os trabalhos em segundo plano para init , para que o script possa sair, deixando-os em segurança em segundo plano. Você provavelmente deseja redirecionar a saída para /dev/null (ou um arquivo de log) para evitar a saída no shell após iniciar o script.

ssh hostname 'command' &>/dev/null &
disown
    
por 28.02.2012 / 23:12
1

O wait não está fazendo com que seu script aguarde? Na página do manual ...

wait [n ...] Wait for each specified process and return its termination status. Each n may be a process ID or a job specifi- cation; if a job spec is given, all processes in that job’s pipeline are waited for. If n is not given, all currently active child processes are waited for, and the return status is zero. If n specifies a non-existent process or job, the return status is 127. Otherwise, the return status is the exit status of the last process or job waited for.

Portanto, seu script está aguardando a conclusão do túnel ssh antes de retornar ao prompt. basta remover o wait e você receberá um aviso de volta e seu túnel estará sendo executado em segundo plano.

    
por 28.02.2012 / 23:41
0

Eu uso screen para ter diferentes conexões e scripts sendo executados na mesma janela do terminal. Isso também me permite desligar minha máquina, ir para casa, ligar minha máquina e recarregar a sessão screen que eu queria manter o controle sobre o que está acontecendo.

É claro que isto está assumindo que eu sou SSH em outra máquina do meu terminal.

    
por 29.02.2012 / 17:03

Tags