367 Stimmen

ssh dazu bringen, einen Befehl im Hintergrund auf dem Zielrechner auszuführen

Dies ist eine Folgefrage zur Frage Wie verwendet man ssh in einem Shell-Skript? Frage. Wenn ich auf dem entfernten Rechner einen Befehl ausführen möchte, der auf diesem Rechner im Hintergrund läuft, wie bekomme ich dann den ssh-Befehl zurück? Wenn ich versuche, einfach das kaufmännische Und (&) am Ende des Befehls einzufügen, bleibt er einfach hängen. Die genaue Form des Befehls sieht wie folgt aus:

ssh user@target "cd /some/directory; program-to-execute &"

Irgendwelche Ideen? Eine Sache, die zu beachten ist, ist, dass Logins auf dem Zielcomputer immer ein Textbanner erzeugen und ich habe SSH Die Tasten sind so eingerichtet, dass kein Passwort erforderlich ist.

2voto

zebrilo Punkte 134

Es erschien mir recht praktisch, eine remote tmux-Sitzung unter Verwendung der tmux new -d <shell cmd> Syntax wie diese:

ssh someone@elsewhere 'tmux new -d sleep 600'

Dadurch wird eine neue Sitzung auf elsewhere Host und der ssh-Befehl auf dem lokalen Rechner kehren fast augenblicklich zur Shell zurück. Sie können dann per ssh zum entfernten Rechner gehen und tmux attach zu dieser Sitzung. Beachten Sie, dass es nichts über lokale tmux läuft, nur remote!

Wenn Sie möchten, dass Ihre Sitzung auch nach Beendigung der Arbeit bestehen bleibt, fügen Sie einfach einen Shell-Launcher nach Ihrem Befehl ein, aber vergessen Sie nicht, ihn in Anführungszeichen zu setzen:

ssh someone@elsewhere 'tmux new -d "~/myscript.sh; bash"'

1voto

PaulT Punkte 11

Wenn ich einen komplizierten Befehl auf einem entfernten Rechner ausführen muss, gebe ich den Befehl gerne in ein Skript auf dem Zielrechner ein und führe dieses Skript einfach per ssh aus.

Zum Beispiel:

# simple_script.sh (located on remote server)

#!/bin/bash

cat /var/log/messages | grep <some value> | awk -F " " '{print $8}'

Und dann führe ich einfach diesen Befehl auf dem Quellcomputer aus:

ssh user@ip "/path/to/simple_script.sh"

0voto

richprice316 Punkte 11
YOUR-COMMAND &> YOUR-LOG.log &    

Dies sollte den Befehl ausführen und eine Prozess-ID zuweisen. Sie können einfach tail -f YOUR-LOG.log verwenden, um die Ergebnisse zu sehen, die in die Datei geschrieben werden, während sie passieren. Sie können sich jederzeit abmelden und der Prozess wird fortgesetzt

0voto

Randy Wilson Punkte 1

Ich habe versucht, dasselbe zu tun, aber mit der zusätzlichen Komplexität, dass ich versuchte, es von Java aus zu tun. Auf einem Rechner, auf dem Java läuft, versuchte ich also, ein Skript auf einem anderen Rechner im Hintergrund auszuführen (mit nohup).

In der Befehlszeile funktionierte Folgendes: (Sie brauchen das "-i keyFile" nicht, wenn Sie es nicht für ssh zum Host benötigen)

ssh -i keyFile user@host bash -c "\"nohup ./script arg1 arg2 > output.txt 2>&1 &\""

Beachten Sie, dass in meiner Befehlszeile ein Argument nach dem "-c" steht, das in Anführungszeichen gesetzt ist. Aber damit es auf der anderen Seite funktioniert, braucht es immer noch die Anführungszeichen, also musste ich es in Anführungszeichen setzen.

Bei Java hat es folgendermaßen funktioniert:

ProcessBuilder b = new ProcessBuilder("ssh", "-i", "keyFile", "bash", "-c",
 "\"nohup ./script arg1 arg2 > output.txt 2>&1 &\"");
Process process = b.start();
// then read from process.getInputStream() and close it.

Es hat ein wenig gedauert, bis es funktionierte, aber jetzt scheint es gut zu funktionieren.

0voto

Sathesh Punkte 6116

Wenn Sie zsh verwenden, benutzen Sie program-to-execute &! ist eine zsh-spezifische Abkürzung, um den Prozess sowohl in den Hintergrund zu stellen als auch zu deaktivieren, so dass er beim Beenden der Shell weiterläuft.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X