Verschieben Sie ein im GNU-Bildschirm gestartetes Programm zu einem anderen Terminal

2974
tjt263

Ich möchte eine Instanz von GNU beenden, screenwährend der Prozess darin erhalten bleibt.

Also öffnete ich mein reguläres Terminalemulatorprogramm und führte den Bildschirm aus. Dann habe ich diese Instanz screenzum Ausführen verwendet ./script_x.sh. Nun, aus welchem ​​Grund auch immer, ich möchte aufhören, screenaber script_x.shich habe seine Aufgabe noch nicht abgeschlossen, und ich bin nicht bereit, meinen Fortschritt aufzugeben.

Kann ich den aktiven Prozess am Leben erhalten, um ihn in meinem regulären Terminalemulator weiter zu bearbeiten?

21
Möchten Sie den Bildschirm wirklich töten oder von ihm trennen? Der Bildschirm ist für die Ausführung eines Prozesses im Hintergrund gedacht, damit Sie in Ihrer normalen Sitzung fortfahren können. Außerdem können Apps nach dem Abmelden weiterlaufen (z. B. trennen Sie Ihre SSH-Sitzung). Sie können sich jederzeit vom Bildschirm trennen, in Ihrer normalen Sitzung fortfahren und dort fortfahren, wo Sie sich in der Bildschirmsitzung befinden. Ihr Terminalemulator hat damit nichts zu tun. BlueCacti vor 8 Jahren 14
Oder erstellen Sie einfach einen weiteren Bildschirm in der `screen'-Sitzung. chrylis vor 8 Jahren 0
Diese Frage riecht nach dem [XY-Problem] (http://xyproblem.info/). Digital Chris vor 8 Jahren 11
@ tjt263 - Sie sagen, Sie bereuen die Verwendung des Bildschirms überhaupt. Was würden Sie tun, um Ihren Prozess am Laufen zu halten, wenn Sie den Bildschirm nicht verwendet hätten? Sie können mit dem Prozess auf dem Bildschirm immer noch dasselbe tun, aber der Bildschirm bietet den zusätzlichen Vorteil, dass Sie ihn vom Prozess trennen und den Prozess ungestört laufen lassen können. Johnny vor 8 Jahren 7
@ DigitalChris Es könnte jetzt tun. Ich finde, der Originaltitel war wahrscheinlich relevanter. Es gibt drei verschiedene Punkte: Ich habe ein Programm in `screen` ausgeführt. Ich wollte "screen" nicht mehr verwenden. Ich wollte das Programm nicht stoppen, das in `screen` lief. Das ist es. Ich weiß nicht, wie ich die Situation klären oder einfacher ausdrücken kann. tjt263 vor 8 Jahren 0
@ tjt263 Die Antwort von Gombai lautete: (auch alle grundlegenden Bildschirmanweisungen) Sie geben "Strg-A" und dann "D" ein. Sie werden von der Sitzung getrennt, die noch ausgeführt wird. Wenn Sie `screen -list 'eingeben, wird es angezeigt. Digital Chris vor 8 Jahren 0
@ DigitalChris Okay, sicher. Also .. An diesem Punkt; Wie kann ich die Interaktion mit meinem Programm fortsetzen? ohne `screen` zu benutzen? tjt263 vor 8 Jahren 0
Warum sagst du "ohne Bildschirm"? Die Art und Weise, wie Sie die Interaktion fortsetzen, betrifft den Bildschirm. Welche Einschränkung hindert Sie daran, sich erneut an Ihre Bildschirmsitzung anzuschließen? Digital Chris vor 8 Jahren 0
@ Digital Chris - ich sage immer "ohne" Bildschirm "", weil das der ganze Punkt der Frage ist. Ich lief zufällig "Bildschirm". *** Ich möchte, dass die zusätzliche Schicht zwischen meinem Terminal und dem Programm verschwunden ist. *** Mein Grund "Warum?" Ist irrelevant. Ich möchte, dass es fertig ist. tjt263 vor 8 Jahren 0

3 Antworten auf die Frage

31
Hennes

TLDR: Praktische Antwort: Nein.

Längere Antwort:

Theoretisch kannst du. Wenn Sie etwas Ähnliches nohup myprog &vom Bildschirm aus gestartet haben, läuft es weiter. Es wird ein Auflegen-Signal ignorieren und keine Eingaben haben, aber theoretisch könnten Sie damit weiterarbeiten.

In der Praxis ist dies nicht der Fall. Wenn Sie also einen Debugger an den laufenden Prozess anhängen und die Dateizugriffspunkte neu schreiben und sicherstellen möchten, dass der Prozess -1 Signale ausgibt, wenn Sie den Bildschirm schließen, lautet die Antwort nein.

Wenn Sie dazu bereit sind, habe ich zu Hause ein Lesezeichen, das auf [SU] zeigt, wo jemand genau das getan hat . Für die Großartigkeit gespeichert, nicht weil es einfach und trivial ist.

Beachten Sie, dass die Frage seit Ihrer Antwort massiv bearbeitet wurde. chrylis vor 8 Jahren 0
Das Trennen eines Prozesses ist ziemlich einfach - es ist eine Frage der Einstellung von Prozessgruppen (mit "disown" oder auf einer niedrigeren Ebene), so dass kein "SIGHUP" gesendet wird, wenn der übergeordnete Prozess beendet wird. Eine erneute Verbindung von I / O ist etwas ganz anderes - da kommt der Debugger ins Spiel. alexis vor 8 Jahren 0
Sie brauchen "nohup" nicht, wenn Sie sich in einer Job-Kontroll-Shell befinden (wie "bash", "ksh", "csh", "zsh", "ash" usw.). Wenn Sie immer noch eine Kontrollshell ohne Job wie Bourne `sh` verwenden, ist es vielleicht Zeit für ein Upgrade. chicks vor 8 Jahren 0
23
aland

Sie können versuchen, reptyrdie bereits laufende Anwendung auf einem anderen Terminal erneut zu installieren. Es gibt jedoch einige Probleme beim Senden des Prozesses in den Hintergrund.

Ich habe es gerade getestet ( htopinnen starten screen, reptyrzu einem anderen Terminal, Kill screen), und es schien gut zu funktionieren. Trotzdem ist es eine wirklich harte Lösung, also keine Garantie.

Weniger hacky als mit gdb :) Hennes vor 8 Jahren 1
14
Gombai Sándor

Ja (wenn "Töten" nicht wirklich zum Töten führt), ist dies genau das, wofür Bildschirm gedacht ist. Sie sollten das Handbuch überprüfen und versuchen, welche davon Ihren Bedürfnissen entspricht:

C-a d C-a C-d (detach) Detach screen from this terminal.  C-a D D (pow_detach) Detach and logout. 

Dann benötigen Sie die Befehlszeilenoptionen -D / -d -R / -r des Bildschirms, je nach Ihrer Wahl.

Dies beantwortet die Frage nicht. Das OP möchte sich nicht vom Bildschirm lösen, sondern den Bildschirmvorgang abbrechen. Guntram Blohm vor 8 Jahren 1
Ja, er hat das geschrieben, aber ich bin nicht sicher, ob er gefragt hat, was er wollte. Gombai Sándor vor 8 Jahren 6
@GuntramBlohm Es ist keineswegs klar, dass das OP die Bildschirmdarstellung versteht, und dies ist der wahrscheinlichste gewünschte Effekt. chrylis vor 8 Jahren 11
@GuntramBlohm OPs Kommentar zu der Frage (~ 10 Stunden nach Ihrem Kommentar) zeigt an, dass OP genau das will Izkata vor 8 Jahren 0
Ich habe jedoch nicht vor, mit `screen` erneut zu verbinden. Ich möchte den aktiven Prozess fortsetzen, jedoch mit meinem regulären "xterm" anstelle von "screen". Ist diese Antwort noch geeignet? tjt263 vor 8 Jahren 0
Ist Ihnen bewusst, dass der Bildschirm kein von xterm verschiedenes Terminal ist, sondern eine Schicht (ein Pseudo-Terminal), die an Ihr echtes Terminal angeschlossen werden kann (vterm, xterm, terminator, (m) rxvt, any), nachdem Sie es von einem anderen Terminal gelöst haben? Und Bildschirm ist derjenige, der Ihren Prozess so ausführt, dass Sie ihn innerhalb des Bildschirms gestartet haben (und er macht es gut). Wenn Sie den Bildschirm töten (wirklich töten), ziehen Sie den Teppich unter Ihrem Prozess heraus ... Ich sehe einfach keinen guten Grund, warum Sie dies tun würden. Gombai Sándor vor 8 Jahren 2
@ GombaiSándor: Ein Grund für _want_, dies zu tun, wäre, den Prozess zu veranlassen, _direct_ mit einem Terminal zu sprechen, um Funktionen durchzuleiten, von denen der Bildschirm nichts weiß. Zum Beispiel habe ich einmal meine eigene Version von xterm gehackt, damit alle komischen Funktionstasten auf meiner Tastatur Escape-Sequenzen senden, die den X11-Keysym und den vollständigen Modifikatorstatus enthalten, anstatt zu versuchen, als wäre es ein VT102 - und dann mit der Installation begonnen Keybindings für sie in Emacs. Diese Sequenzen würden den Bildschirm nicht unbeschadet passieren. Henning Makholm vor 8 Jahren 1
(Dies ist natürlich nicht _actually_ ein Problem, das einfach gelöst werden könnte, indem der Prozess zwangsweise direkt mit einem anderen pty verbunden wird, da das Unix-Modell keine Möglichkeit bietet, die $ TERM-Variable des Prozesses während der Ausführung in etwas anderes zu ändern provozieren, um eine völlig neue Terminaldefinition im Handumdrehen einzulesen - was bedeutet, dass _why_ screen alles in und aus seinen eigenen virtuellen Steuerungssequenzen übersetzen muss. Henning Makholm vor 8 Jahren 0
@ GombaiSándor * JA! Ich weiß das! * *** Ich versuche, diese Schicht zu entfernen! *** * Ich möchte den Teppich unter meinem Prozess herausziehen und ihn auf den Beinen landen lassen! * tjt263 vor 8 Jahren 0