Execute um comando nohup sobre SSH e desconecte

46

Eu quero executar um script, start.shem um servidor remoto que execute isso:

nohup node server.js &

Ingenuamente, chamo SSH assim:

ssh myserver <<EOF
./start.sh &
EOF

Isso inicia o script, mas deixa a sessão conectada. Quero seguir esta etapa com outros comandos em um script, para que não seja bom.

Como posso fazer o SSH na máquina remota, iniciar um nohupcomando em segundo plano e desconectar? Suponho que poderia colocar o processo SSH em segundo plano, mas isso não parece certo.

Steve Bennett
fonte

Respostas:

40

Você já encontrou o caminho certo, aqui documento.

NOTA : você pode colocar o ssh (cliente) em segundo plano, colocando um & no final, mas não verá a saída. Se você realmente deseja fazer isso, redirecione o stdout / stderr para um arquivo, caso precise verificar a resposta do host remoto.

Basicamente, você pode fazer isso de qualquer maneira:

Execute diretamente o comando {, s}

ssh user@host "nohup command1 > /dev/null 2>&1 &; nohup command2; command3"

OU

ssh user@host "$(nohup command1 > /dev/null 2>&1 &) && nohup command2 >> /path/to/log 2>&1 &"

NOTA : &&requer que o primeiro comando retorne 0 antes de executar o segundo

Documento Use Here

ssh user@host << EOF
nohup command1 > /dev/null 2>&1 &
nohup command2 >> /path/to/command2.log 2>&1 &
......
EOF

As três opções acima devem funcionar para você.

Além disso, dê uma olhada na resposta aqui: https://askubuntu.com/a/348921/70270

Terry Wang
fonte
Obrigado - então o que faltava era realmente o > /dev/null.
21813 Steve Bennett
Nem por isso, > /dev/null 2>&1é descartar qualquer saída stdout / stderr, redirecionando para o buraco negro lol
Terry Wang
5
Observe que eu sugiro usar >> em vez de apenas> para gravar nos arquivos de log. Caso contrário, você receberá apenas os erros desde a última execução.
Alexis Wilke #
É correto que, se eu simplesmente iniciar um comando como nohup command2 >> /path/to/command2.log 2>&1 &em um terminal e depois fechar o terminal, o processo seja perdido?
Luke
1
@TerryWang, o segundo exemplo não funcionará com e comercial, seguido de duplo e comercial, consulte unix.stackexchange.com/q/67006/86716
tsionyx
7

Por que não apenas tmux ou screen e acabar com isso? Por exemplo:

$ tmux new -s SessionNameHere
$ nohup /path/to/your/script.sh

Isso é prático se for algo que fará um loop contínuo ou levará um tempo para terminar. Você pode se desconectar da sessão e ela permanecerá ativa.

Anon
fonte
2
Realmente não se encaixa no que estou pedindo, que é um único comando que pode ser executado no meu laptop, que se conecta, bifurca um comando e, em seguida, desconecta.
Steve Bennett
3
ssh node "nohup sleep 10 &"

não está sendo executado no modo daemon, mantendo sua sessão ssh conectada. A sessão ssh retornará em 10 segundos, apesar de você ter usado nohup.

O motivo é que stdout remoto e stderr ainda estão conectados à sua sessão. Mantém a sessão ssh ativa, nohup não ajuda.

Este:

ssh node "nohup sleep 10 1>/dev/null 2>/dev/null &"

retorna imediatamente. Ele inicia o processo remoto com nohup e sai da sessão ssh imediatamente.

Sergey Cherepanov
fonte
Este foi exatamente o nosso problema. Tínhamos apenas 1> file.log. O ssh na máquina estava preso. O processo na máquina do 'nó' estava em execução. Quando adicionamos 2> & 1 imediatamente antes do fechamento &, isso deixava o ssh desconectar.
Lee Meador
2

Forma mais curta:

ssh host "(command 1; command 2; ...) &>/dev/null &"

Parece que o próprio bash realiza a desanexação do terminal, portanto, não é necessário nohup. Eu executo o Ubuntu 14.04 x86_64, bash 4.3.11.

Alek_A
fonte
1
Isso não fornece uma resposta para a pergunta. Para criticar ou solicitar esclarecimentos a um autor, deixe um comentário abaixo da postagem - você sempre pode comentar em suas próprias postagens e, quando tiver reputação suficiente , poderá comentar em qualquer post . - Da avaliação
David Foerster
Isso não parece funcionar. nohup; apenas gera uma reclamação sobre argumentos ausentes.
Steve Bennett
@ DavidFoerster, não sei por que, se command 1; command 2; ...representa o script OP deseja executar. OP também pode usar caso especial de esta resposta:ssh myserver ./start.sh &>/dev/null &
Alek_A