Verschieben eines bereits laufenden Prozesses auf den Bildschirm

222

Bei meinem Bürojob bin ich routinemäßig über VNC mit einer Linux-Box verbunden.

Manchmal starte ich einen Remote-Job auf der Konsole und stelle später fest, dass er viel länger als erwartet ausgeführt wird. (Hätte eigentlich unter Screen damit anfangen sollen ...)

Ich möchte meine Workstation nicht über Nacht laufen lassen, nur um die VNC-Sitzung offen zu halten. Ich möchte diesen bereits ausgeführten Remote-Job in eine Bildschirmsitzung (auf der Remote-Box) verschieben, damit ich die Workstation ausschalten und am nächsten Morgen die Verbindung wiederherstellen kann.

Wie kann das überhaupt gemacht werden?

DevSolar
quelle
2
und es ist ein Betrug, serverfault.com/questions/49877/… - scheint, dass es nicht getan werden kann.
Paul Dixon
Suchen Sie nach screenify script.
Vashu

Antworten:

217

Schauen Sie sich reptyr an , das macht genau das. Die Github-Seite enthält alle Informationen.

reptyr - Ein Tool zum "erneuten Kopieren" von Programmen.

reptyr ist ein Dienstprogramm zum Übernehmen eines vorhandenen laufenden Programms und zum Anhängen an ein neues Terminal. Hat einen lang laufenden Prozess über ssh gestartet, muss ihn aber verlassen und möchte ihn nicht unterbrechen? Starten Sie einfach einen Bildschirm, greifen Sie ihn mit reptyr, beenden Sie die ssh-Sitzung und fahren Sie nach Hause.

VERWENDUNGSZWECK

reptyr PID

"reptyr PID" erfasst den Prozess mit der ID PID und hängt ihn an Ihr aktuelles Terminal an.

Nach dem Anhängen übernimmt der Prozess die Eingabe von und schreibt die Ausgabe in das neue Terminal, einschließlich ^ C und ^ Z. (Leider müssen Sie im Hintergrund immer noch "bg" oder "fg" im alten Terminal ausführen. Dies lässt sich wahrscheinlich nicht auf vernünftige Weise beheben, ohne Ihre Shell zu patchen.)

DaveJohnston
quelle
22
Wenn Sie, wie ich, auf den obigen Link schauten und kurz überlegten, ob Sie das Programm von der Quelle aus installieren sollten, sollten Sie es sich überlegen apt-get: Auf Debian-Systemen ist es nur ein Katzensprung.
mlissner
3
Das funktioniert super, wie habe ich das noch nie gesehen?
deed02392
3
Das ist fantastisch! Ich würde es 10 Mal verbessern, wenn ich könnte! Reptyr ist auch in RedHat-Repos erhältlich. Einfach 'yum install' um es zu bekommen.
Mark J. Bobak
5
Funktioniert nur in den einfachsten Fällen:Unable to attach. (This most commonly means that 11690 has a suprocesses)
Mehrdad
2
Zumindest als root können Siereptyr -T PID
ChristophK
45

Sie können dies nicht einfach tun. Ich würde vorschlagen, es sich zur Gewohnheit zu machen, den Bildschirm als erstes zu starten, nachdem Sie eine Konsole geöffnet haben.

Für Ihr eigentliches Problem gibt es jedoch noch eine andere Möglichkeit: Nachdem Sie Ihren Job über das Terminal gestartet haben, können Sie ihn mit der Tastenkombination Strg-Z und anschließend im Hintergrund ausführen bg. Trennen Sie danach den Job von der übergeordneten Shell. in bash würden Sie tun disown -h %<jobid>. Danach können Sie das Terminal sicher schließen und der Job wird weiter ausgeführt.

Graf
quelle
3
Das hat in meinem Fall sehr gut funktioniert. reptyr und retty konnten den Prozess nicht erfassen, aber alles, was ich brauchte, war, in der Lage zu sein, ein Terminal zu schließen und den Prozess laufen zu lassen.
STW
10
Zu Ihrer Information: nach disown -ing dem Prozess kann es sein reptyr innerhalb -ed Bildschirm .
Adam
1
Dies tötete mein laufendes Programm :(
Mehrdad
39

Wie sieht es mit der Verwendung von retty im neu gestarteten Bildschirmprozess aus, wenn Sie Linux verwenden?

$ screen -S my_process
$ retty $(pgrep my_process)
/redraw

HTH

Prost,

Rob Wells
quelle
1
Ich wusste nichts von retty, danke. Für die Art von Langzeitjobs, die ich mir vorstelle, bin ich jedoch etwas zurückhaltend, ein Tool zu verwenden, das sich selbst als "sehr leicht getestet" bezeichnet. Ich gehe mit Earls Lösung.
1
sehe keine Anlegestelle in Gentoo
Sergei
kann nicht an 4858 anhängen
Arnold Roa