Eseguendo un comando di lunga durata su ssh


10

Sto sshentrando in un server e sto avviando uno script Python che richiederà circa. 24 ore per il completamento. Cosa succede se la mia connessione Internet si interrompe nel mezzo? Questo fermerà il comando?

C'è un modo per eseguire il mio comando di lunga durata in modo che le disconnessioni locali non lo influenzino e potrei continuare a vederne l'output dopo aver effettuato sshnuovamente l'accesso?

Risposte:


29

Il modo migliore è usare screen(sul server) per avviare una sessione per eseguire il comando e quindi disconnettere lo schermo in modo che continui a funzionare e tu possa fare altre cose o semplicemente disconnetterti dal server. L'altra opzione è usare nohupin combinazione con &così avrestinohup <command> &


Schermo. Oppure puoi impostare un'attività cron se è qualcosa che esegui più di una volta.
Xeon,

2
Se vieni disconnesso mentre è in esecuzione sullo schermo, screen -rti riconnetterai.
dpflug,

2

Puoi anche utilizzare disownse hai già avviato il processo senza screenonohup


2

Le risposte esistenti possono funzionare bene, ma avevo bisogno di qualcosa per BusyBox (una shell e un set di strumenti per hardware minimo come i router domestici). Il mio sistema non ha screen, dtach, at, disown, o addirittura nohup! Quindi grazie a tbc0 su SO ( link ), ho trovato questo gioiello. Ritorna immediatamente ma il processo del server continua a essere eseguito:

ssh myserver 'sleep 100 >&- 2>&- <&- &'

Oppure, se sono necessari più comandi:

ssh myserver '(echo one; sleep 100; echo two; sleep 200) >&- 2>&- <&- &'

Spiegazione:

  • >&- - chiudere la maniglia stdout
  • 2>&- - chiudi stderr
  • <&- - chiudi stdin
  • & - metti il ​​processo in background

Questo non utilizza programmi esterni e dovrebbe funzionare su ksh, ash, Bourne shell, bash, ecc.


1

Se si avvia un processo in background e si chiude la sessione, il processo verrà adottato da init (PID 1).

Se ho una sessione e faccio:

]$ sleep 10000 &
]$ exit

e apri un'altra sessione ed esegui:

]$ ps -ef | grep sleep
501      26387     1  0 16:37 ?        00:00:00 sleep 10000
root     26422 21360  0 16:40 pts/0    00:00:00 grep sleep

Il mio processo è ancora in esecuzione e vediamo che il suo processo padre è ora 1 (init).

In alternativa puoi impostare il tuo script come faresti con un demone. Una rapida ricerca rivela questo link apparentemente utile: http://onlamp.com/python/pythoncook2/solution.csp?day=1 . Se volessi adottare questo approccio.

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.