Impedisci che l'attività linux attualmente in esecuzione venga interrotta dopo il logout da SSH


18

Ho un compito computazionale in esecuzione per alcuni giorni su un server Linux tramite connessione SSH. Non è in background, quindi la connessione SSH è in attesa dell'attività.

Voglio riavviare il computer locale (non il server) da cui ho aperto la sessione ssh, ma voglio mantenere l'attività in esecuzione. È possibile?

Risposte:


22

Se la vostra attività è già avviata, è troppo tardi *per prendere in considerazione soluzioni alternative che inserto un ulteriore livello tra la sshsessione e la shell di eseguire il comando, come screen, tmux, byobu, nohupe simili.

Se il supporto del processo deve essere posizionato in background e in particolare non si blocca quando stdoute non stderrè scrivibile / chiuso, è possibile inserirlo in background prima di disconnettersi ControlZe bgquindi staccarlo dalla shell con l' disownintegrato.

per esempio:

$ ssh localhost
You have new mail.
Last login: Fri Jun  6 11:26:56 2014

$ /bin/sleep 3600    


^Z[1] + Stopped                  /bin/sleep 3600
$ bg
[1] /bin/sleep 3600&
$ jobs
[1] +  Running                 /bin/sleep 3600
$ disown %1
$ exit
Connection to localhost closed.
$ ps -ef|grep sleep
jlliagre 12864     1  0 21:12 ?        00:00:00 /bin/sleep 3600
jlliagre 13056 12477  0 21:13 pts/18   00:00:00 grep sleep
$ 

*Come ha commentato Bob, in realtà ci sono molti modi per hackerare una sessione tty sotto Linux. repty, retty , injcode e neercs . Il più avanzato sembra essere reptyr ma potresti aver bisogno dei privilegi di root per consentire a ptrace di hackerare il tuo processo.


Ho usato Ctrl + Z, il lavoro si è fermato e passato in background, quindi ho eseguito il disowncomando. È tornato: bash: avviso: eliminazione del lavoro interrotto 1 con il gruppo di processi 24876. Ora il mio lavoro è elencato ps -allma sembra non funzionare (l'utilizzo della CPU è 0%)
Ali

Sembra che il mio processo sia stato interrotto. Immagino che avrei dovuto fornire l'ID di processo con disowncomando
Ali,

@Ali Penso che ti sia dimenticato di eseguire il comando bg per riprendere il lavoro sospeso.
Jason Zhu,

1
@JasonZhu Grazie per averlo indicato. Non era chiaro il bgcomando richiesto nella prima parte della mia risposta. Modificato.
jlliagre,

2
Se hai dimenticato il comando bg e hai eseguito solo il comando disown, dovresti essere in grado di riavviare il processo con kill -CONTla stessa approssimazione di bg.
Kasperd,

5

Una soluzione è usare lo schermo GNU . È possibile avviare screen, eseguire il comando, quindi staccare con C-a d. Successivamente, per riconnetterti, esegui screen -re si torna alla sessione precedente.

Altri vantaggi dello schermo sono la gestione delle finestre (in modo da poter passare ad altre shell mentre il comando è in esecuzione, senza bisogno di una nuova connessione SSH) e consente al comando di rimanere in primo piano, sia nella sessione corrente che in una successiva.

Modifica: come notato nei commenti, funzionerà solo se ti ricordi di iniziare screenprima di eseguire il comando. Se il comando è già in esecuzione, avrai bisogno della soluzione di @ jlliagre.


2
tmuxè un altro programma del genere screenche ti permette di avere una sessione remota che non è legata alla tua attuale connessione SSH.
Darth Android

2
La tua soluzione è fantastica Tuttavia non si adatta completamente alla mia domanda: ho chiesto informazioni sul processo attualmente in esecuzione, non su un processo che verrà eseguito in futuro utilizzando screen.
Ali,

Ah ok. In tal caso, penso che dovrai usare la soluzione di @ jlliagre. (Per quanto ne so, non esiste un modo per collegare un processo già in esecuzione a qualcosa di simile screeno tmux.)
Scott Weldon,

1

Uno dei modi "standard" per farlo è usare il nohupcomando, incluso in coreutils, in questo modo:

nohup COMMAND [ARGS] &

Ma il comando reindirizzerà l'output ( STDOUT& STDERRAFAIK) del programma in un file nohup.out, rendendolo in qualche modo fastidioso a volte (come generare un enorme file di registro), quindi potresti voler creare il tuo reindirizzamento o reindirizzarlo a / dev / null se vuoi.


2
Leggi ancora. Il processo è già in esecuzione .
Lightness Races con Monica,

/ vergogna non ha letto attentamente. Scusa.
wangguoqin1001,

In realtà nohuppuò essere utilizzato per questo. Basta sospendere il processo in esecuzione e inviarlo in background ( Ctrl+ Zed eseguire bg) e quindi è possibile eseguire nohup %1.
mike

0

Inoltre nohuppuoi avviare il processo in background usando "&" e subshell:

Basta aggiungere il comando con & e racchiuderlo tra parentesi

$ (thecommand args &)

Diciamo che il tuo processo guadagna il pid 1922:

$ ps -f
UID        PID  PPID  C STIME TTY          TIME CMD
usr      11473  2643  0 15:07 pts/1    00:00:00 bash
usr      11922     1  0 15:11 pts/1    00:00:00 thecommand

Guarda che è staccato dal processo di shell 11473 che era il suo genitore originale. Quindi, se si esce o si interrompe la shell corrente (11473), il processo 11922 continua a funzionare e verrà disconnesso dai punti.

Prova a uscire dalla shell e inserisci una nuova shell. Anche se, questa shell è connessa agli stessi punti, ora puoi vedere il processo senza un punto:

$ ps -fp 11922
UID        PID  PPID  C STIME TTY          TIME CMD
usr      11922     1  0 15:11 ?        00:00:00 thecommand

Non so come viene chiamato o documentato in Posix, ma lo uso dal 1990 in bsh, ksh e ora in bash.

Infine, puoi usare il bgcomando shell incorporato:

Basta avviare il programma e se si decide di metterlo in pausa o si prevede di tenerlo in background, digitare CTRL + Z:

$ thecommand
^Z
[1] Stopped          thecommand

Ora lascia che continui a funzionare in background:

$ bg
[1]+ thecommand &

Se guardi le informazioni sul processo, ha ancora un processo padre:

$ ps -f
UID        PID  PPID  C STIME TTY          TIME CMD
usr      12046  2643  0 15:18 pts/6    00:00:00 bash
usr      12571 12046  0 16:00 pts/6    00:00:00 thecommand
usr      12601 12046  0 16:04 pts/6    00:00:00 ps -f

Quindi, esci dal processo corrente. Il processo in esecuzione in background è staccato dal suo genitore originale e continua a funzionare in background:

$ exit

Accedi di nuovo e guarda le informazioni sul processo:

$ ps -f 12571
UID        PID  PPID  C STIME TTY          TIME CMD
usr      12571     1  0 16:00 ?        00:00:00 thecommand
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.