Wenn Ihre Aufgabe bereits gestartet wurde, ist es zu spät*
um alternative Lösungen in Betracht zu ziehen, die eine zusätzliche Schicht zwischen Ihren ssh
einfügen Sitzung und die Shell, die den Befehl ausführt, wie screen
, tmux
, byobu
, nohup
und dergleichen.
Wenn Ihre Prozessunterstützung in den Hintergrund gestellt werden soll und vor allem nicht hängen bleibt, wenn stdout
und stderr
nicht beschreibbar/geschlossen sind, können Sie es in den Hintergrund schalten, bevor Sie sich mit Control abmelden Z und bg
Trennen Sie es dann mit disown
von Ihrer Shell eingebaut.
zB:
$ ssh localhost
You have new mail.
Last login: Fri Jun 6 11:26:56 2014
$ /bin/sleep 3600
^Z[1] + Stopped /bin/sleep 3600
$ bg
[1] /bin/sleep 3600&
$ jobs
[1] + Running /bin/sleep 3600
$ disown %1
$ exit
Connection to localhost closed.
$ ps -ef|grep sleep
jlliagre 12864 1 0 21:12 ? 00:00:00 /bin/sleep 3600
jlliagre 13056 12477 0 21:13 pts/18 00:00:00 grep sleep
$
*
Wie Bob kommentierte, gibt es tatsächlich mehrere hackige Methoden, um eine tty-Sitzung unter Linux neu zuzuordnen. repty, retty, injcode und neercs. Das fortschrittlichste scheint reptyr zu sein, aber Sie benötigen möglicherweise Root-Rechte, damit ptrace Ihren Prozess hacken kann.
Eine Lösung ist die Verwendung von GNU screen. Sie könnten screen
starten , führen Sie Ihren Befehl aus und trennen Sie ihn dann mit C-a d
. Um die Verbindung später wieder herzustellen, führen Sie screen -r
aus , und Sie befinden sich wieder in Ihrer vorherigen Sitzung.
Weitere Vorteile von screen sind die Fensterverwaltung (so dass Sie zu anderen Shells wechseln können, während Ihr Befehl ausgeführt wird, ohne dass eine neue SSH-Verbindung erforderlich ist), und es ermöglicht, dass Ihr Befehl im Vordergrund bleibt, egal ob in der aktuellen oder einer späteren Sitzung.
Bearbeiten: Wie in den Kommentaren erwähnt, funktioniert dies nur, wenn Sie daran denken, screen
zu starten bevor Sie den Befehl ausführen. Wenn der Befehl bereits ausgeführt wird, benötigen Sie die Lösung von @jlliagre.