Ich habe ein Skript geschrieben, mit dem ich einen neuen Dienst auf mehrere von mir kontrollierte Maschinen pushe und verteile. Um den Prozess auszuführen, verwende ich ssh, um den Prozess remote zu starten. Leider scheint der SSH-Befehl immer dann, wenn ich SSH zum Starten des Prozesses verwende, nie zurückzukehren, was dazu führt, dass das Skript blockiert.
Der Befehl wird wie folgt angegeben: ssh $ user @ $ host "/ root / command &". Wenn ich einfache Befehle wie ps oder who ausführe, wird der SSH-Befehl sofort zurückgegeben. Wenn ich jedoch versuche, meinen Prozess zu starten, wird er nicht zurückgegeben. Ich habe versucht, meinen Prozess in ein einfaches Bash-Skript zu packen, das den Prozess startet und dann beendet. Dabei bleibt jedoch auch der SSH-Befehl hängen (auch wenn das Bash-Skript eine Erfolgsmeldung ausgibt und normal beendet wird).
Hat jemand einen Einblick, was dieses Verhalten verursacht und wie ich den SSH-Befehl zurückgeben kann, sobald der Prozess gestartet wurde?
Vielen Dank für Ihre Erkenntnisse!
Antworten:
SSH verbindet stdin, stdout und stderr der Remote-Shell mit Ihrem lokalen Terminal, sodass Sie mit dem Befehl interagieren können, der auf der Remote-Seite ausgeführt wird.
Als Nebeneffekt wird es so lange ausgeführt, bis diese Verbindungen geschlossen wurden. Dies geschieht nur, wenn der Remote-Befehl und alle seine untergeordneten Elemente (!) Beendet wurden (da die untergeordneten Elemente, mit denen "&" beginnt, std * von ihren erben) übergeordneter Prozess und lassen Sie ihn offen).
Also musst du sowas benutzen
<,> Und 2> & 1 leiten stdin / stdout / stderr von Ihrem Terminal weg. Das "&" bewirkt dann, dass Ihr Skript in den Hintergrund tritt. In der Produktion würden Sie stdin / err natürlich in eine geeignete Logdatei umleiten.
Sehen
http://osdir.com/ml/network.openssh.general/2006-05/msg00017.html
Bearbeiten:
Habe gerade herausgefunden, dass das
< /dev/null
obige nicht notwendig ist (aber das Umleiten von stdout / err ist ). Keine Ahnung warum ...quelle
+1
! Funktioniert bei mir. Und Sie können die Ausgabe auch drucken, indem Sie die Protokolldatei erneut ausgeben:ssh user@host "/script/to/run > /tmp/ssh.stdout 2>&1 && cat /tmp/ssh.stdout && rm -f /tmp/ssh.stdout"
Du könntest nohup versuchen . Man nohup für mehr Details.
Wenn Sie die Ausgabe auf dem Remote-Computer behalten möchten, finden Sie hier eine Variante .
quelle
Eine andere Alternative wäre es, eine abgetrennte zu zünden
screen(1)
, so etwas wie:Dies startet einen getrennten Bildschirm (der die gesamte Interaktion in ihm aufzeichnet) und kehrt dann sofort zurück und beendet die ssh-Sitzung.
Mit etwas mehr Einfallsreichtum können Sie auf diese Weise recht komplexe Remote-Befehlsaufrufe lösen.
quelle
quelle
Ich denke der richtige Weg wäre
quelle