come eseguire un comando in background usando ssh e scollegare la sessione
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;'
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
- prende un modello e lo copia su un server remoto
- crea uno script per eseguire una simulazione con il modello e inviarlo al server
- avvia lo script sul server e disconnette
- 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.