Como forçar a conexão ssh a sair no final do script

2

Eu tenho um script que é composto de duas partes. part1 cria uma conexão ssh, part2 executa um script (cerca de 800 linhas e conta até agora).

part1:
ssh $target_server "bash -s" < $target_script

O problema é que part2 contém as seguintes linhas:

fc_START_WINE_APP () { nohup 'DISPLAY=:11.0 wine "$1"' & }
. . .
fc_START_WINE_APP $applicationFull

Basicamente, ele verifica se um aplicativo está sendo executado e, se não, o reinicia (assim como algumas outras coisas).

O problema é que, quando a função é executada para start do aplicativo, ela faz com que a conexão ssh seja interrompida.

Existe uma maneira de forçar a conexão ssh a sair quando chegar ao final do script.

Eu tentei exit , exit 0 , exit 1 etc no final de part2 . Eu tentei ssh -f em part1 mas depois part2 parece não executar.

ATUALIZAÇÃO 2016-01-28

Um exemplo seria o seguinte

**SCRIPT1**
#!/bin/bash

target_server="1.2.3.4"
target_script="/home/user/script2.sh"

echo "Script 1 Started"

ssh $target_server "bash -s" < $target_script

echo "Script 1 Ended"

.

**SCRIPT 2**
#!/bin/bash

echo "Script 2 Started"

fc_START_WINE_APP () { nohup 'DISPLAY=:11.0 wine "$1"' & }

applicationFull="/home/tech/myApp.exe"

fc_START_WINE_APP $applicationFull

echo "Script 2 Ended"

Ao executar isso, ele chega até Script 2 Ended , mas não fecha a conexão ssh e, portanto, nunca chega tão longe Script 1 Ended .

Como você provavelmente pode dizer, o ponto principal do script é conectar-se a um determinado servidor e iniciar um aplicativo (Old Windows) usando o Wine.

Meu entendimento é que ele precisa ser iniciado usando nohup . . & para parar o fechamento do aplicativo quando a conexão ssh é fechada, da mesma forma que se eu fizer login diretamente (usando putty por exemplo), execute nohup myCommand & e em seguida, saia e, em seguida, myCommmand ainda será executado.

    
por IGGt 25.01.2016 / 17:53

3 respostas

1

Ao desanexar o programa, você deve redirecionar as duas saídas para algum lugar (para / dev / null ou para o arquivo de log), e use:

&>/dev/null &                         ...when bash --version >= 4

ou

>/dev/null 2>&1 &                     ...all shells

em vez de apenas:

&

... assim que iniciar o ssh não precisa se preocupar com stdout, stderr e pode sair.

nohup nem sempre é importante (dependendo da configuração do shell e do tratamento do sinal hup do programa ..., no meu teste: 'sleep', 'xclock' e 'wine notepad.exe' continuam a funcionar sem necessidade de nohup). E em situações em que o nohup é necessário, geralmente o screen e o tmux são soluções melhores.

Assumindo bash > = 4, o exemplo mínimo para testar o comportamento de desanexar é o seguinte:

ssh 1.2.3.4 "sleep 10 &"               ... exits after 10 seconds
ssh 1.2.3.4 "sleep 10 &>/dev/null &"   ... exits immediately

Na sua situação específica de script1 / 2, a função fc_START_WINE_APP do script2 deve ser:

{ DISPLAY=:11.0 wine "$1" &>/dev/null & }

... funciona bem para o valor de $ 1 'notepad.exe' ... mas se você ainda quiser nohup por algum motivo, ele aceita apenas um comando, e você tem 2 (configuração de exibição e runing wine), então você deve embrulhe-o dentro do bash:

{ nohup bash -c "DISPLAY=:11.0 wine $1" &>/dev/null & }
    
por 28.01.2016 / 18:09
0

Acho que encontrei o jeito de fazer isso:

part1:
ssh $target_server "bash -s" < $target_script > logfile.log 2> logfile.err &

Desta forma, o script principal é concluído instantaneamente, deixando o segundo script para ser executado em segundo plano.

    
por 28.01.2016 / 17:51
0

Sua sessão ssh precisa de um terminal de controle , para esse uso ssh -t

Além disso, você pode executar part2 do ssh diretamente. Então a part1 ficará assim:

**SCRIPT1**
#!/bin/bash

target_server="1.2.3.4"
target_script="/home/user/script2.sh"

echo "Script 1 Started"

scp $target_script $target_server:/tmp/my_script_part2.sh
ssh -t $target_server /tmp/my_script_part2.sh
ssh $target_server rm -f /tmp/my_script_part2.sh

echo "Script 1 Ended"
    
por 28.01.2016 / 17:24

Tags