Como executar um comando em segundo plano usando o SSH e destacar a sessão
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;'
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
- leva um modelo e copia para um servidor remoto
- cria um script para executar uma simulação com o modelo e empurrá -lo para o servidor
- inicia o script no servidor e desconecte
- 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.