it-swarm.com.de

Wie kann ich einen laufenden Prozess ablehnen und einer neuen Bildschirmshell zuordnen?

Ich habe ein laufendes Programm auf einer SSH-Shell. Ich möchte es anhalten und in der Lage sein, die Ausführung zu unterbrechen, wenn ich zurückkomme.

Eine Möglichkeit, dies zu tun, bestand darin, den Besitz auf eine Bildschirm-Shell zu übertragen und sie dort weiter laufen zu lassen.

Gibt es eine andere Vorgehensweise?

164
levesque

Die Verwendung von GNU screen ist die beste Wahl.

Startbildschirm wird ausgeführt, wenn Sie sich zum ersten Mal anmelden - Ich führe screen -D -R aus, führe Ihren Befehl aus und trenne ihn entweder mit CTRL-Z oder setze ihn ab oder trenne ihn vom Bildschirm, indem ich CTRL-A und dann D drücke .

Wenn Sie sich erneut am Computer anmelden, stellen Sie die Verbindung wieder her, indem Sie screen -D -R ausführen. Sie befinden sich in derselben Shell wie zuvor. Sie können jobs ausführen, um den angehaltenen Prozess anzuzeigen, wenn Sie dies getan haben, und %1 (oder die entsprechende Jobnummer) ausführen, um ihn erneut in den Vordergrund zu stellen.

88
Andrew Yochum

Sie können die "Eigentümerschaft" des Programms über die Shell mit dem integrierten disown widerrufen:

# press Ctrl+Z to suspend the program
bg
disown

Dies weist die Shell jedoch nur an, kein SIGHUP -Signal an das Programm zu senden, wenn die Shell beendet wird. Das Programm behält jede Verbindung zum Terminal bei, normalerweise als Standardeingabe-, Ausgabe- und Fehlerströme. Es gibt keine Möglichkeit, diese wieder an ein anderes Terminal anzuschließen. ( Der Bildschirm emuliert für jedes Fenster ein Terminal, sodass die Programme an das Bildschirmfenster angehängt werden.)


Es ist möglich, die Dateideskriptoren erneut an eine andere Datei anzuhängen, indem das Programm in einem Debugger angehängt wird (dh mit ptrace ) und aufgerufen wird open, dup und close. Es gibt einige Tools, die dies tun. Dies ist ein kniffliger Prozess, und manchmal stürzen sie den Prozess stattdessen ab. Die Möglichkeiten umfassen (Links, die aus Antworten auf gesammelt wurden. Wie kann ich einen laufenden Prozess ablehnen und ihn einer neuen Bildschirm-Shell zuordnen? und Kann ich einen bereits gestarteten Prozess nohup/screen? ):

Um einen Prozess zwischen Terminals zu verschieben oder einen abgelehnten wieder anzuschließen, können Sie z. Reptyr .

67
jofel

Meine Lieblingslösung ist die Verwendung von tmux. Sie können die Sitzung trennen und in einem anderen Terminal erneut anhängen.

Wenn Sie sich von der vorherigen Sitzung getrennt haben, können Sie das Terminal sicher schließen. später benutze tmux attach, um zur Sitzung zurückzukehren, auch wenn Sie sich abgemeldet haben.

28
daisy

Es gibt auch ein kleines Dienstprogramm namens retty , mit dem Sie laufende Programme wieder an ein anderes Terminal anschließen können.

21
adamg

Ich benutze es nicht regelmäßig, aber neercs behauptet, dies zu unterstützen. Es ist ein screen-ähnliches Programm mit verschiedenen ausgefallenen Funktionen wie einer besseren Fensterverwaltung, aber das Wichtigste, was es bietet, ist die Möglichkeit, einen Prozess in ein Fenster zu importieren

19
Michael Mrozek

Wenn Sie es nur anhalten und anschließend neu starten möchten, können Sie kill mit dem Signal STOP oder CONT verwenden.

Informieren Sie sich zunächst über die Prozesse PID mit

$ ps aux

Senden Sie dann die Signale an die für den Prozess aufgeführte PID

$ kill -STOP <PID>

$ kill -CONT <PID>
9
yunzen

"injcode" von ThomasHabets scheint genau das zu sein, was ich brauche:

https://github.com/ThomasHabets/injcode

Mit dem Programm injcode kann beliebiger Code in einen laufenden Prozess eingefügt werden, unabhängig davon, ob Sie dies zuvor gewusst haben und ob Sie screen oder tmux ausgeführt haben

Aus der README:

Beispiel 1: Verschieben Sie irssi von einem Terminal zu einem anderen

Vielleicht verschieben Sie es in einen Bildschirm.

Starten Sie irssi zuerst in einem Terminal.

Führen Sie injcode in einem anderen Terminal aus: $ injcode -m retty

Irssi sollte jetzt in das zweite Terminal verlegt werden, einschließlich eines neuen Steuerterminals.

9
user2688272

Das hat bei mir funktioniert:

  1. bg der Prozess
  2. jobs -l Prozessnummer finden
  3. tmux Shell-Fenstermanager starten
  4. reptyr -L PROCESSNUMBER

reptyr 's -L war notwendig, um dies zum Laufen zu bringen:

-L Like '-l', but also redirect the child's stdio to the slave.

wegen dieses Fehlers:

$ reptyr 30622

[-] Unable to open the tty in the child.
Unable to attach to pid 30622: Permission denied

Und mit -L

$ reptyr -L 30622
Opened a new pty: /dev/pts/4
1
kqw