Anhängen eines Prozesses an ein Terminal unter LInux

Ich habe eine Datei in vi geöffnet, die in einem Terminal ausgeführt wird (xterm), wenn ich das Terminal direkt schließe, ohne die Datei zuerst zu schließen, kann ich sehen, dass vi immer noch im Hintergrund läuft (ps x). Gibt es jetzt eine Möglichkeit, diesen Prozess, dh vi, an ein anderes Terminal anzuhängen, damit ich meine Arbeit an der Datei fortsetzen kann? Ich habe auch den Befehl fd ausprobiert, aber er schlägt fehl.

 7
Author: Ravi Gupta, 2010-12-13

4 answers

Dies ist "sauber" nicht möglich. Es gibt Tools wie screen und tmux, die ein remanentes virtuelles Terminal erstellen: Sie können Ihr Programm innerhalb des Bildschirms starten, die Bildschirmsitzung trennen und später die Bildschirmsitzung auf einem anderen Terminal erneut anhängen. Aber das erfordert vorausschauende Planung.

Es ist möglich, mit ptrace mit den Dateideskriptoren des Prozesses zu spielen, um sie wieder mit einem anderen Terminal zu verbinden. Das funktioniert nicht zuverlässig, weil es erstellen könnte Inkonsistenzen in den Datenstrukturen des Prozesses: Einige Programme haben nichts dagegen, andere stürzen ab. Sie können dies tun, indem Sie das Programm an einen Debugger anhängen und die richtige Reihenfolge von Systemaufrufen ausgeben (mindestens open, dup und close für jede Standardeingabe, Standardausgabe und Standardfehler). Es gibt mehrere vorhandene Tools, die dies tun können, zum Beispiel neercs und retty.

Siehe auch Wie kann ich einen laufenden Prozess über ssh anhalten, ablehnen, einem zuordnen neue Bildschirm Shell und unpause es?, Skript über SSH anzeigen?, Kann ich einen bereits gestarteten Prozess nohup/screen?, Befehl fortsetzen, der in der SSH-Sitzung ausgeführt wird.

 3
Author: Gilles 'SO- stop being evil',
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/techietown.info/template/agent.layouts/content.php on line 61
2017-04-13 12:37:10

Sie können versuchen GNU screen. Es ist für diesen Zweck gemacht.

Screen ist ein Vollbild-Fenstermanager, der ein physisches Terminal zwischen mehreren Prozessen multiplext, normalerweise interaktive Shells

 1
Author: slhck,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/techietown.info/template/agent.layouts/content.php on line 61
2012-07-17 21:59:18

Sie können GDB verwenden, um einen laufenden Prozess an ein Terminal anzuhängen.

Hier ist eine Beschreibung, die auf mehrere Antworten auf eine Frage verteilt ist (siehe insbesondere die von Mirek):

Https://stackoverflow.com/questions/593724/redirect-stderr-stdout-of-a-process-after-its-been-started-using-command-line

 0
Author: Chris Stratton,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/techietown.info/template/agent.layouts/content.php on line 61
2017-05-23 12:41:35

Das geht nicht. Töte einfach den abgetrennten Prozess. Wenn Sie dies absichtlich tun möchten, schauen Sie sich den Befehl 'Bildschirm' an. Dies wird Sie jedoch nicht retten, wenn Ihre zugrunde liegende Shell stirbt.

 -1
Author: Belrog,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/techietown.info/template/agent.layouts/content.php on line 61
2011-01-14 12:17:13