2009-10-27 8 views
20

Attualmente sto provando a ssh su una macchina remota ed eseguo uno script, quindi lascio il nodo con lo script in esecuzione. Di seguito è il mio script. Tuttavia, quando viene eseguito, lo script viene eseguito correttamente sulla macchina ma si blocca la sessione ssh. Qual è il problema?come eseguire un comando in background usando ssh e scollegare la sessione

ssh -x [email protected]$node 'rm -rf statuslist 
         mkdir statuslist 
         chmod u+x ~/monitor/concat.sh 
         chmod u+x ~/monitor/script.sh 
         nohup ./monitor/concat.sh & 
         exit;' 

risposta

24

Ci sono alcune situazioni in cui si desidera eseguire/avviare alcuni script su un computer/server remoto (che termina automaticamente) e disconnettersi dal server.

esempio: Uno script in esecuzione su una scatola che, quando eseguito

  1. prende un modello e lo copia a un server remoto
  2. crea uno script per l'esecuzione di una simulazione con il modello e spingerlo al server
  3. avvia lo script sul server e disconnette
  4. Lo scopo dello script avviato è quello di eseguire la simulazione nel server e una volta completato (ci vorranno giorni per completare) copiare i risultati sul client.

vorrei utilizzare il seguente comando:

ssh remoteserver 'nohup /path/to/script `</dev/null` >nohup.out 2>&1 &' 

@CKeven, puoi mettere tutti quei comandi su una sceneggiatura, spingerlo al server remoto e di avviare nel modo seguente:

echo '#!/bin/bash 
rm -rf statuslist 
mkdir statuslist 
chmod u+x ~/monitor/concat.sh 
chmod u+x ~/monitor/script.sh 
nohup ./monitor/concat.sh & 
' > script.sh 

chmod u+x script.sh 

rsync -azvp script.sh remotehost:/tmp 

ssh remotehost '/tmp/script.sh `</dev/null` >nohup.out 2>&1 &' 

Spero che questo funziona ;-)

Edit: È inoltre possibile utilizzare ssh user @ host 'ghiaione n -S NomeSessione -d -m "/ path/to/file eseguibile"'

che crea una sessione di screen distaccato e corre comando di destinazione all'interno di esso

+0

Cosa succede se il comando che si sta eseguendo richiede l'input da un file (come un'importazione db di grandi dimensioni, ad esempio mysql cayblood

4

Potrebbe essere lo stream di input standard. Prova ssh -n ... o ssh -f ....

+0

Nizza. Grazie. ' ssh -f "utente @ host DISPLAY = myhost: 0.0 qtcreator &" ' – kyb

21

Cosa ne pensi dell'uso di screen per questo? È possibile eseguire screen tramite ssh per avviare il comando (concat.sh) e quindi si potrebbe tornare alla sessione dello schermo se si desidera monitorarlo (potrebbe essere utile, a seconda di ciò che concat fa).

Per essere più precisi, provate questo:

ssh -t [email protected]$node screen -dm -S testing ./monitor/concat.sh 

Si dovrebbe trovare che i rendimenti pronta subito, e che concat.sh è in esecuzione sulla macchina remota. Spiegherò alcune delle opzioni:

  • ssh -t rende un TTY. lo schermo ha bisogno di questo.
  • screen -dm avvia la modalità "scollegata". Questo è come "sfondo" per i tuoi scopi.
  • -S test dà un nome alla sessione dello schermo. È facoltativo ma consigliato.

Ora, una volta che hai fatto questo, si può andare alla macchina remota ed eseguire questo:

screen -r testing 

Questo attribuirà a sessione schermata che contiene il programma. Da lì puoi controllarlo, ucciderlo, vederne l'output e così via. Ctrl-A, quindi d ti separerà dalla sessione sullo schermo. screen -ls elencherà tutte le sessioni in esecuzione.

+0

ti dispiace dirmi esplicitamente come farlo? –

+2

@John Zwinck, ha funzionato sicuramente per te? Il seguente comando d o non funziona per me: ssh -t HOST "screen -dm -S sleep sleep 10". Dice semplicemente "Connessione a HOST chiuso" e quando accedo al server non ci sono schermi separati. – richardkmiller

+4

@richardkmiller: Quando l'ho provato, ho ottenuto lo stesso (cattivo) risultato che hai ottenuto. Ho cambiato l'opzione '-t' in ssh per essere' -f', invece, in modo da basare il comando (e non allocare un TTY), e poi ha funzionato. Sospetto che qualcosa sia cambiato negli ultimi 2 anni di Linux da quando ho scritto questa risposta ... prova 'ssh -f HOST" screen -dm -S sleep sleep 10 "' e potresti trovare che funziona ora. –

0

Per me, solo che questa ha funzionato:

screen -dmS name sh my-script.sh 

Questo, ovviamente, dipende dallo schermo e ti consente di allegare in un secondo momento, se vuoi stdin o stdout. Lo schermo termina quando termina my-script.sh.

0

Qui di seguito è una decisione molto più comune che ha richiesto alcuni sforzi per trovare, ed è veramente funziona per me:

#!/usr/bin/bash 
theScreenSessionName="test" 
theTabNumber="1" 
theStuff="date; hostname; cd /usr/local; pwd; /usr/local/bin/top" 

echo "this is a test" 

ssh -f [email protected] "/usr/local/bin/screen -x $theScreenSessionName -p $theTabNumber -X stuff \" 
$theStuff 
\"" 

Si invia la lista $ theStuff di comandi per la scheda No $ theTabNumber della sessione schermo $ theScreenSessionName creato preliminarmente sul 'server' per conto di 'utente'.

Si prega di essere a conoscenza di uno spazio bianco in coda dopo -X roba \" che viene inviato a superare problema tecnico un dell'opzione 'roba'. L'spazi e $ theStuff nella riga successiva vengono aggiunti da 'Invio' (^ M) sequenze di tasti. DA NON PERDERE 'EM!

il 'questa è una prova' messaggio fa eco nel terminale iniziale e $ comandi theStuff vengono realmente eseguiti all'interno dello schermo/scheda menzionato.

Problemi correlati