So führen Sie einen Befehl im Hintergrund mit SSH aus und lösen Sie die Sitzung ab

StackOverflow https://stackoverflow.com/questions/1628204

  •  06-07-2019
  •  | 
  •  

Frage

Ich versuche derzeit, SSH in eine Remote -Maschine zu bringen und ein Skript auszuführen und dann den Knoten mit dem Skript auszuführen. Unten ist mein Skript. Wenn es jedoch ausgeführt wird, wird das Skript erfolgreich auf dem Computer ausgeführt, aber die SSH -Sitzung hängt. Was ist das Problem?

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;'
War es hilfreich?

Lösung

Es gibt einige Situationen, in denen Sie einige Skripte auf einem Remote -Computer/Server (die automatisch enden) ausführen und starten möchten und vom Server trennen möchten.

ZB: Ein Skript, das auf einem Feld ausgeführt wird, das bei der Ausführung von

  1. Nimmt ein Modell und kopiert es auf einen Remote -Server
  2. Erstellt ein Skript zum Ausführen einer Simulation mit dem Modell und drückt es auf den Server
  3. Startet das Skript auf dem Server und trennen Sie die Verbindung
  4. Die Aufgabe des so begonnenen Skripts besteht darin, die Simulation auf dem Server auszuführen und nach Abschluss der Fertigstellung die Ergebnisse wieder auf den Client zu kopieren.

Ich würde den folgenden Befehl verwenden:

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

@CKeven können Sie alle diese Befehle auf ein Skript einfügen, auf den Remote -Server drücken und wie folgt initiieren:

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 &'

Hoffe das funktioniert ;-)

Bearbeiten: Sie können auch ssh user@host 'Bildschirm -s SessionName -d -m "/path/to/ausführbar" verwenden "'

Dies schafft eine abgelöste Bildschirmsitzung und führt darin ein Zielbefehl aus

Andere Tipps

Was denkst du über die Verwendung screen dafür? Sie könnten rennen screen über SSH, um den Befehl zu starten (concat.sh) und dann könnten Sie in die Bildschirmsitzung zurückkehren, wenn Sie sie überwachen möchten (möglicherweise können Sie praktisch sein, je nachdem, was CONTATUR tut).

Um genauer zu sein, versuchen Sie Folgendes:

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

Sie sollten feststellen, dass die Eingabeaufforderung sofort zurückkehrt und dass concat.sh Läuft auf dem Remote -Computer. Ich werde einige der Optionen erklären:

  • ssh -t macht einen tty. Der Bildschirm braucht dies.
  • screen -dm Startet es im "distanzierten" Modus. Dies ist wie "Hintergrund" für Ihre Zwecke.
  • -S Das Testen gibt Ihrer Bildschirmsitzung einen Namen. Es ist optional, aber empfohlen.

Sobald Sie dies getan haben, können Sie zum Remote -Computer gehen und dies ausführen:

screen -r testing

Dadurch werden Sie an die Bildschirmsitzung angebracht, die Ihr Programm enthält. Von dort aus können Sie es steuern, töten, die Ausgabe sehen und so weiter. Ctrl-a, dann wird D Sie von der Bildschirmsitzung abnehmen. screen -ls wird alle laufenden Sitzungen auflisten.

Es könnte der Standardeingangsstrom sein. Versuchen ssh -n ... oder ssh -f ....

Für mich funktionierte nur das:

screen -dmS name sh my-script.sh

Dies hängt natürlich vom Bildschirm ab und ermöglicht es Ihnen später, wenn Sie jemals Stdin oder Stdout wünschen. Der Bildschirm endet, wenn my-script.sh endet.

Im Folgenden finden Sie eine viel häufigere Entscheidung, die einige Anstrengungen zum Finden erforderte, und es funktioniert wirklich für mich:

#!/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
\""

Es sendet $ thestuff -Liste der Befehle an die Registerkarte Nr. $ Thetabnumber der Bildschirmsitzung $ thescreenSessionname vorläufig im "Server" im Namen von "Benutzer" erstellt.

Bitte beachten Sie eine nachfolgende Whitespace nach -x -Zeug ", die gesendet wird, um einen Fehler der Option" Stuff "zu überwinden. Die Whitespace und $ thestuff in der nächsten Zeile werden durch 'Enter' (^m) Tastenanschläge angehängt. Verpassen Sie nicht. Verpassen Sie nicht. 'Sie!

Die Nachricht "Dies ist ein Test" wird im Anfangsterminal wiedergegeben, und $ thestuff -Befehle werden wirklich in der genannten Bildschirm/Registerkarte ausgeführt.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top