Pergunta

Atualmente, estou tentando SSH em uma máquina remota e executar um script e depois deixar o nó com o script em execução. Abaixo está o meu script. No entanto, quando é executado, o script é executado com sucesso na máquina, mas a sessão SSH está pendurada. Qual é o problema?

ssh -x $username@$node 'rm -rf statuslist
                        mkdir statuslist
                        chmod u+x ~/monitor/concat.sh
                        chmod u+x ~/monitor/script.sh
                        nohup ./monitor/concat.sh &
                        exit;'
Foi útil?

Solução

Existem algumas situações em que você deseja executar/iniciar alguns scripts em uma máquina/servidor remoto (que será finalizado automaticamente) e se desconecte do servidor.

por exemplo: um script em uma caixa que quando executado

  1. leva um modelo e copia para um servidor remoto
  2. cria um script para executar uma simulação com o modelo e empurrá -lo para o servidor
  3. inicia o script no servidor e desconecte
  4. O dever do script assim iniciado é executar a simulação no servidor e, uma vez concluído (levará dias para concluir) copiar os resultados de volta ao cliente.

Eu usaria o seguinte comando:

ssh remoteserver 'nohup /path/to/script `</dev/null` >nohup.out 2>&1 &'

@Ckeven, você pode colocar todos esses comandos em um script, empurrá -lo para o servidor remoto e iniciá -lo da seguinte forma:

echo '#!/bin/bash  
rm -rf statuslist  
mkdir statuslist  
chmod u+x ~/monitor/concat.sh  
chmod u+x ~/monitor/script.sh  
nohup ./monitor/concat.sh &  
' > script.sh

chmod u+x script.sh

rsync -azvp script.sh remotehost:/tmp

ssh remotehost '/tmp/script.sh `</dev/null` >nohup.out 2>&1 &'

Espero que isso funcione ;-)

EDIT: Você também pode usar o usuário ssh@host 'Screen -s SessionName -d -m "/path/to/executável"'

Que cria uma sessão de tela isolada e executa o comando de destino dentro dela

Outras dicas

O que você acha de usar screen por esta? Você pode correr screen via ssh para iniciar o comando (concat.sh) e então você poderá retornar à sessão de tela se quisesse monitorá -la (pode ser útil, dependendo do que a Concat faz).

Para ser mais específico, tente o seguinte:

ssh -t $username@$node screen -dm -S testing ./monitor/concat.sh

Você deve achar que o prompt retorna imediatamente e que concat.sh está em execução na máquina remota. Vou explicar algumas das opções:

  • ssh -t faz um tty. A tela precisa disso.
  • screen -dm faz com que ele inicie no modo "desapegado". É como "fundo" para seus propósitos.
  • -S O teste fornece um nome à sua sessão de tela. É opcional, mas recomendado.

Agora, depois de fazer isso, você pode ir à máquina remota e executar isso:

screen -r testing

Isso o anexará à sessão de tela que contém seu programa. A partir daí, você pode controlá -lo, matá -lo, ver sua saída e assim por diante. Ctrl-A, então D o destacará da sessão de tela. screen -ls listará todas as sessões de corrida.

Pode ser o fluxo de entrada padrão. Tentar ssh -n ... ou ssh -f ....

Para mim, só isso funcionou:

screen -dmS name sh my-script.sh

É claro que isso depende da tela e permite anexar mais tarde, se você deseja stdin ou stdout. A tela será encerrada quando o my-script.sh terminar.

Abaixo está uma decisão muito mais comum que exigiu alguns esforços para encontrar, e realmente funciona para mim:

#!/usr/bin/bash
theScreenSessionName="test"
theTabNumber="1"
theStuff="date; hostname; cd /usr/local; pwd; /usr/local/bin/top"

echo "this is a test"

ssh -f user@server "/usr/local/bin/screen -x $theScreenSessionName -p $theTabNumber -X stuff \" 
$theStuff
\""

Ele envia $ Lista de comandos para o Tab no $ theTabNumber da sessão de tela $ thescreensessionName criado preliminarmente no 'servidor' em nome do 'usuário'.

Por favor, esteja ciente de um espaço em branco à direita após -x material "que é enviado para superar a falha de uma opção de 'coisas'. O espaço em branco e $ theStuff na próxima linha são anexados por 'enter' (^m) tecla 'Eles!

A mensagem "Esta é um teste" é ecoada no terminal inicial e os comandos $ theStuff são realmente executados dentro da tela/guia mencionados.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top