Eseguire un comando nohup su SSH, quindi disconnettersi


46

Voglio eseguire uno script, start.shsu un server remoto che esegue questo:

nohup node server.js &

Ingenuamente, chiamo SSH in questo modo:

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

Questo avvia lo script, ma lascia la sessione connessa. Voglio seguire questo passaggio con altri comandi in uno script, quindi non va bene.

Come posso SSH sul computer remoto, avviare un nohupcomando in background, quindi disconnettermi? Suppongo che potrei mettere il processo SSH stesso in background, ma ciò non sembra giusto.

Risposte:


40

Hai già trovato la strada giusta, qui documento.

NOTA : puoi mettere ssh (client) in background posizionando un & alla fine, ma non vedrai l'output. Se vuoi davvero farlo, reindirizza lo stdout / stderr su un file nel caso in cui devi controllare la risposta dall'host remoto.

Fondamentalmente puoi farlo in entrambi i modi:

Esegui direttamente il comando {, s}

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

O

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

NOTA : &&richiede il primo comando per restituire 0 prima di eseguire il secondo

Usa qui il documento

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

Le 3 opzioni sopra dovrebbero funzionare per te.

Inoltre, dai un'occhiata alla risposta qui: https://askubuntu.com/a/348921/70270


Grazie - quindi il pezzo che mi mancava era davvero il > /dev/null.
Steve Bennett,

Non proprio, > /dev/null 2>&1è scartare qualsiasi output stdout / stderr reindirizzando al buco nero lol
Terry Wang

5
Nota che suggerirei di usare >> invece di> per scrivere nei file di registro. Altrimenti, otterrai solo gli errori dall'ultima corsa.
Alexis Wilke,

È corretto che se avessi semplicemente avviato un comando come nohup command2 >> /path/to/command2.log 2>&1 &in un terminale e poi chiuso il terminale, il processo andasse perso?
Luca

1
@TerryWang il secondo esempio non funzionerà con la e commerciale seguita dalla doppia e commerciale, vedere unix.stackexchange.com/q/67006/86716
tsionyx

7

Perché non solo tmux o screen e finirlo? Per esempio:

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

Questo è pratico se si tratta di qualcosa che continuerà in loop o impiegherà un po 'di tempo per terminare. È possibile disconnettersi dalla sessione e rimarrà attivo.


2
Non si adatta davvero a ciò che sto chiedendo, che è un singolo comando che può essere eseguito sul mio laptop, che si collegherà, fork un comando, quindi disconnettersi.
Steve Bennett,

3
ssh node "nohup sleep 10 &"

non è in esecuzione in modalità demone, mantenendo connessa la sessione ssh. La sessione Ssh tornerà tra 10 secondi, nonostante tu abbia usato nohup.

Il motivo è che stdout e stderr remoti sono ancora connessi alla sessione. Mantiene viva la sessione SSH, nohup non aiuta.

Questo:

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

ritorna immediatamente. Avvia il processo remoto con nohup ed esce immediatamente dalla sessione ssh.


Questo era esattamente il nostro problema. Avevamo solo 1> file.log. Lo ssh sull'unica macchina era bloccato. Il processo sul computer "nodo" era in esecuzione. Quando abbiamo aggiunto un 2> & 1 appena prima della chiusura &, questo ha permesso a ssh di disconnettersi.
Lee Meador,

2

Forma più corta:

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

Sembra che quel bash stesso esegua il distacco dal terminale, quindi non è necessario alcunhup. Corro Ubuntu 14.04 x86_64, bash 4.3.11.


1
Questo non fornisce una risposta alla domanda. Per criticare o richiedere chiarimenti a un autore, lascia un commento sotto il suo post: puoi sempre commentare i tuoi post e una volta che avrai una reputazione sufficiente sarai in grado di commentare qualsiasi post . - Dalla recensione
David Foerster,

Questo non sembra funzionare. nohup; emette solo un reclamo per argomenti mancanti.
Steve Bennett,

@DavidFoerster, nessuna idea del perché, se command 1; command 2; ...rappresenta lo script OP vuole essere eseguito. OP può anche usare un caso speciale di questa risposta:ssh myserver ./start.sh &>/dev/null &
Alek_A
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.