Verschieben Sie ein auf dem GNU-Bildschirm gestartetes Programm auf ein anderes Terminal


21

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

Also öffnete ich mein reguläres Terminal-Emulator-Programm und führte den Bildschirm aus. Dann habe ich diese Instanz von screenausgeführt ./script_x.sh. Jetzt, aus welchem ​​Grund auch immer, möchte ich aufhören, habe screenaber script_x.shnoch nicht seine Aufgabe erfüllt und bin nicht bereit, meinen Fortschritt einzubüßen.

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


14
Möchten Sie den Bildschirm wirklich töten oder sich davon lösen? Der Bildschirm dient zum Ausführen eines Prozesses im Hintergrund, sodass Sie in Ihrer normalen Sitzung fortfahren können. Außerdem können Apps nach dem Abmelden weiter ausgeführt werden (z. B. Trennen der SSH-Sitzung). Sie können sich jederzeit vom Bildschirm lösen, mit Ihrer normalen Sitzung fortfahren und an der Stelle weitermachen, an der Sie sich in der Bildschirmsitzung befunden haben. Ihr Terminalemulator hat damit nichts zu tun.
BlueCacti

Oder erstellen Sie einfach einen anderen Bildschirm innerhalb der screenSitzung.
chrylis -on strike-

11
Diese Frage riecht nach dem XY-Problem .
Digital Chris

7
@ tjt263 - Sie sagen, Sie bedauern die Verwendung von screen. Was würden Sie also tun, um Ihren Prozess am Laufen zu halten, wenn Sie screen nicht verwendet hätten? Sie können mit dem Prozess auf dem Bildschirm immer noch dasselbe tun, aber der zusätzliche Vorteil des Bildschirms besteht darin, dass Sie sich davon lösen und Ihren Prozess ungestört ablaufen lassen können.
Johnny

@ DigitalChris Es könnte jetzt tun. Ich bin der Meinung, dass der Originaltitel wahrscheinlich relevanter war. Es gibt 3 verschiedene Punkte: Ich habe ein Programm ausgeführt screen. Ich wollte aufhören zu benutzen screen. Ich wollte das Programm, das im Inneren lief, nicht stoppen screen. Das ist es. Ich weiß nicht, wie ich die Situation klären oder einfacher ausdrücken soll.
Stimmen

Antworten:


31

TLDR: Praktische Antwort: Nein.

Längere Antwort:

Theoretisch kannst du. Wenn Sie so etwas wie nohup myprog &vom Bildschirm aus gestartet haben, läuft es weiter. Es ignoriert ein Aufhängesignal und hat keine Eingabe, aber theoretisch können Sie damit weiterarbeiten.

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

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


Beachten Sie, dass die Frage seit Ihrer Antwort massiv bearbeitet wurde.
chrylis -on strike-

Das Trennen eines Prozesses ist ziemlich einfach - es geht darum, Prozessgruppen (mit disownoder auf einer niedrigeren Ebene) festzulegen, damit keine SIGHUPgesendet werden, wenn der übergeordnete Prozess stirbt. Das erneute Verbinden von I / O ist eine andere Sache - hier kommt der Debugger ins
Spiel

Sie brauchen nicht , nohupwenn Sie in einem Job - Control - Shell sind (wie bash, ksh, csh, zsh, ash, etc.). Wenn Sie immer noch eine Nicht-Job-Kontroll-Shell wie Bourne verwenden, ist es shmöglicherweise an der Zeit, ein Upgrade durchzuführen.
Küken

23

Sie können versuchen, reptyreine bereits laufende Anwendung mit einem anderen Terminal erneut zu verbinden. Es gibt jedoch einige Probleme beim Senden in den Hintergrund.

Ich habe es gerade getestet ( htopdrinnen anfangen screen, reptyres zu einem anderen Terminal bringen, töten screen) und es schien in Ordnung zu funktionieren. Trotzdem ist es eine wirklich hackige Lösung, also keine Garantie.


1
Weniger hacky als mit GDB :)
Hennes

14

Ja (wenn "Töten" nicht wirklich tötet), ist das eigentlich genau das, wofür der Bildschirm ist. Sie sollten das Handbuch überprüfen und versuchen, welches davon Ihren Anforderungen 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, abhängig von Ihrer Wahl.


1
Dies beantwortet die Frage nicht. Das OP möchte sich nicht vom Bildschirm lösen, sondern den Bildschirmvorgang beenden.
Guntram Blohm unterstützt Monica am

6
Ja, das hat er geschrieben, aber ich bin mir nicht sicher, ob er gefragt hat, was er wollte.
Gombai Sándor

11
@GuntramBlohm Es ist überhaupt nicht klar, dass das OP versteht, wie der Bildschirm funktioniert, und dies ist der wahrscheinlichste gewünschte Effekt.
chrylis -on strike-

2
Ist Ihnen bewusst, dass screen kein anderes Terminal als xterm ist, sondern eine Ebene (ein Pseudoterminal), die an Ihr reales Terminal (vterm, xterm, terminator, (m) rxvt, any) angehängt werden kann, nachdem Sie es von einem anderen Terminal getrennt haben? Und Bildschirm ist das, was Ihren Prozess am Laufen hält, wenn Sie ihn innerhalb des Bildschirms gestartet haben (und es funktioniert gut). Wenn Sie Bildschirm töten (wirklich töten), dann ziehen Sie den Teppich unter Ihrem Prozess aus ... Ich sehe nur keinen guten Grund, warum Sie dies tun würden.
Gombai Sándor

1
@ GombaiSándor: Ein Grund zu wollen , das zu tun wäre , um den Prozess reden zu machen direkt an ein Endgerät , um durch Fähigkeiten zu passieren , dass Bildschirm nicht kennt. Ich habe zum Beispiel einmal meine eigene Version von xterm gehackt, um alle seltsamen Funktionstasten auf meiner Tastatur dazu zu bringen, Escape-Sequenzen zu senden, die das X11-Tastensymbol und den vollständigen Modifikatorstatus enthielten, anstatt vorzutäuschen, es sei ein VT102 - und dann mit der Installation begonnen Tastenkombinationen für sie in Emacs. Diese Sequenzen würden den Bildschirm nicht unbeschadet passieren.
Henning Makholm
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.