Executar bash em um servidor remoto sem esperar até o fim

4

Eu enfrentei o desejo de executar scripts diferentes simultaneamente em servidores diferentes. (+/- 2 segundos não é um problema)  A condição é iniciar os scripts pela chamada do servidor principal e NÃO pelo cronograma Cron. Eu tentei o SSH, mas dessa forma eu devo esperar até que o script termine de rodar no servidor remoto e só então descarte a sessão. Eu estou procurando uma maneira alternativa, que permite iniciar o script no servidor remoto sem esperar pelo seu fim. P.S. - Não estou usando o CLI no meu caso de uso, mas um aplicativo de chamada de script externo, que aciona o script no servidor principal.  Obrigado.

    
por faceless 22.12.2017 / 19:42

2 respostas

4

GNU screen permitirá que você execute tarefas remotas sem permanecer conectado ao servidor, exceto em sistemas em que systemd elimina todos os processos no logout 1 . Especificamente, você pode usar:

#!/bin/sh
ssh server1 screen -d -m command1
ssh server2 screen -d -m command2
# ...

Cada sessão local ssh termina imediatamente após o lançamento do processo screen remoto, que, por sua vez, sai assim que o comando executado termina. Você pode sufixar cada linha ssh com & para fazer as conexões em paralelo.

Trecho do manual, screen(1) :

-d -m Start screen in "detached" mode. This creates a new session but doesn't attach to it. This is useful for system startup scripts.

1 Se você estiver em um sistema que usa systemd configurado com killUserProcesses=yes , será necessário substituir screen por systemd-run --user --scope screen .

    
por 22.12.2017 / 20:52
4

Use "& renegar ’para enviar o comando para um sub shell que é então deserdado. Use nohup se você precisar de rastreamento de processo. Abaixo, usei o binário sleep em uma ligação time para fornecer um feedback rápido no console sobre o que está acontecendo.

time sleep 5

O shell está bloqueando, por isso você não poderá sair da sessão.

time sleep 5 &

É subshelled, portanto, sair ainda matará o comando sleep.

time nohup sleep 5 &

Isso subjaz o nohup, então você está melhorando devido ao registro, mas um sub-shell ainda será anexado ao shell que o criou e, portanto, ele e seus processos serão destruídos quando a sessão terminar. Você realmente só precisa negar:

#!/bin/bash

nohup sleep 500 & disown
pid=$!
echo $pid > /tmp/time.pid
exit 0
    
por 22.12.2017 / 20:20