Domanda

Attualmente sto provando a scrivere su una macchina remota ed eseguire uno script, quindi lasciare il nodo con lo script in esecuzione. Di seguito è la mia sceneggiatura. Tuttavia, quando viene eseguito, lo script viene eseguito correttamente sulla macchina ma la sessione ssh si blocca. Qual è il problema?

ssh -x $username@$node 'rm -rf statuslist
                        mkdir statuslist
                        chmod u+x ~/monitor/concat.sh
                        chmod u+x ~/monitor/script.sh
                        nohup ./monitor/concat.sh &
                        exit;'
È stato utile?

Soluzione

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

es: uno script in esecuzione su una scatola che quando eseguita

  1. prende un modello e lo copia su un server remoto
  2. crea uno script per eseguire una simulazione con il modello e inviarlo al server
  3. avvia lo script sul server e disconnette
  4. Il compito dello script così avviato è quello di eseguire la simulazione sul server e una volta completata (ci vorranno giorni per completarla) copiare i risultati sul client.

Vorrei usare il seguente comando:

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

@CKeven, puoi inserire tutti quei comandi su uno script, inviarlo al server remoto e avviarlo come segue:

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 funzioni ;-)

Modifica: Puoi anche usare ssh user @ host 'screen -S SessionName -d -m " / path / to / eseguable "'

Che crea una sessione schermo separata ed esegue il comando target al suo interno

Altri suggerimenti

Cosa ne pensi dell'utilizzo di screen per questo? È possibile eseguire screen tramite ssh per avviare il comando ( concat.sh ) e quindi si potrà tornare alla schermata se si desidera monitorarlo ( fai attenzione, a seconda di cosa fa il concat).

Per essere più specifici, prova questo:

ssh -t $username@$node screen -dm -S testing ./monitor/concat.sh

Dovresti trovare che il prompt ritorna immediatamente e che concat.sh è in esecuzione sul computer remoto. Spiegherò alcune delle opzioni:

  • ssh -t crea un TTY. lo schermo ha bisogno di questo.
  • screen -dm lo fa iniziare in " scollegato " modalità. Questo è come "sfondo" per i tuoi scopi.
  • I test
  • -S danno un nome alla tua sessione schermo. È facoltativo ma consigliato.

Ora, una volta che hai fatto questo, puoi andare sul computer remoto ed eseguire questo:

screen -r testing

Questo ti collegherà alla sessione dello schermo che contiene il tuo programma. Da lì puoi controllarlo, ucciderlo, vedere il suo output e così via. Ctrl-A, quindi d ti staccherà dalla sessione dello schermo. screen -ls elencherà tutte le sessioni in esecuzione.

Potrebbe essere il flusso di input standard. Prova ssh -n ... o ssh -f ... .

Per me, solo questo ha funzionato:

screen -dmS name sh my-script.sh

Questo, ovviamente, dipende dallo schermo e ti consente di collegarti in seguito, se mai vuoi lo stdin o lo stdout. Lo schermo si chiuderà automaticamente quando my-script.sh termina.

Di seguito è una decisione molto più comune che ha richiesto alcuni sforzi per trovare, e funziona davvero 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 user@server "/usr/local/bin/screen -x $theScreenSessionName -p $theTabNumber -X stuff \" 
$theStuff
\""

Invia l'elenco di comandi $ theStuff alla scheda No $ theTabNumber della sessione dello schermo $ theScreenSessionName creato in via preliminare sul "server" per conto di "utente".

Si prega di essere consapevoli di uno spazio bianco finale dopo -X roba \ " che viene inviato per superare il problema tecnico di un'opzione "roba". Lo spazio bianco e $ theStuff nella riga successiva vengono aggiunti con i tasti 'Invio' (^ M). NON PERDERE EM!

Il " questo è un test " il messaggio viene ripetuto nel terminale iniziale e i comandi $ theStuff vengono effettivamente eseguiti nella schermata / scheda menzionata.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top