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.

391voto

Jax Punkte 6607

Ich hatte dieses Problem in einem Programm, das ich vor einem Jahr geschrieben habe - es stellte sich heraus, dass die Antwort ziemlich kompliziert ist. Sie müssen sowohl nohup als auch die Ausgabeumleitung verwenden, wie in dem Wikipedia-Artikel über nohup zu Ihrer Information hierher kopiert.

Nohuping backgrounded jobs ist für zum Beispiel nützlich, wenn man über SSH angemeldet ist, da im Hintergrund laufende Aufträge dazu führen können, dass die Shell beim Abmelden aufgrund einer Race Condition Bedingung [2]. Dieses Problem kann auch durch die Umleitung aller drei E/A-Ströme:

nohup myprogram > foo.out 2> foo.err < /dev/null &

287voto

Russ Punkte 2729

Das war für mich die sauberste Art, das zu tun:-

ssh -n -f user@host "sh -c 'cd /whereever; nohup ./whatever > /dev/null 2>&1 &'"

Das Einzige, was danach läuft, ist der eigentliche Befehl auf dem entfernten Rechner

41voto

Fd's umleiten

Die Ausgabe muss umgelenkt werden mit &>/dev/null die sowohl stderr als auch stdout nach /dev/null umleitet und ein Synonym für >/dev/null 2>/dev/null o >/dev/null 2>&1 .

Paranthesen

Die beste Möglichkeit ist die Verwendung von sh -c '( ( command ) & )' wobei Befehl alles ist.

ssh askapache 'sh -c "( ( nohup chown -R ask:ask /www/askapache.com &>/dev/null ) & )"'

Nohup-Muschel

Sie können auch direkt nohup verwenden, um die Shell zu starten:

ssh askapache 'nohup sh -c "( ( chown -R ask:ask /www/askapache.com &>/dev/null ) & )"'

Schöner Start

Ein anderer Trick besteht darin, nice zu verwenden, um den Befehl/die Shell zu starten:

ssh askapache 'nice -n 19 sh -c "( ( nohup chown -R ask:ask /www/askapache.com &>/dev/null ) & )"'

27voto

hometoast Punkte 11253

Wenn Sie die Verbindung nicht offen halten wollen/können, können Sie Bildschirm wenn Sie die Rechte für die Installation haben.

user@localhost $ screen -t remote-command
user@localhost $ ssh user@target # now inside of a screen session
user@remotehost $ cd /some/directory; program-to-execute &

Um die Bildschirmsitzung zu beenden: ctrl-a d

Zum Auflisten von Bildschirmsitzungen:

screen -ls

So verbinden Sie eine Sitzung erneut:

screen -d -r remote-command

Beachten Sie, dass der Bildschirm auch mehrere Shells innerhalb einer Sitzung erstellen kann. Ein ähnlicher Effekt kann erreicht werden mit tmux .

user@localhost $ tmux
user@localhost $ ssh user@target # now inside of a tmux session
user@remotehost $ cd /some/directory; program-to-execute &

Um die tmux Sitzung zu beenden: ctrl-b d

Zum Auflisten von Bildschirmsitzungen:

tmux list-sessions

So verbinden Sie eine Sitzung erneut:

tmux attach <session number>

Die standardmäßige tmux-Steuertaste, ' ctrl-b ', ist etwas schwierig zu benutzen, aber es gibt mehrere Beispielkonfigurationen für tmux, die mit tmux geliefert werden und die Sie ausprobieren können.

22voto

cmcginty Punkte 106764

Ich wollte nur ein funktionierendes Beispiel zeigen, das Sie ausschneiden und einfügen können:

ssh REMOTE "sh -c \"(nohup sleep 30; touch nohup-exit) > /dev/null &\""

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