Ich habe ein laufendes Programm auf einer SSH-Shell. Ich möchte es anhalten und seine Ausführung wieder aufnehmen können, wenn ich zurückkomme.
Eine Möglichkeit, dies zu tun, bestand darin, sein Eigentum auf eine Bildschirmhülle zu übertragen und sie so dort laufen zu lassen.
Gibt es eine andere Vorgehensweise?
ssh
terminal
gnu-screen
job-control
disown
levesque
quelle
quelle
Antworten:
Verwenden Sie GNU
screen
am besten.Startbildschirm läuft beim ersten Login - ich laufen
screen -D -R
, laufen Ihren Befehl, und entweder trennen oder zu unterbrechen sie mitCTRL-Z
und trennen Sie von Bildschirm durch DrückenCTRL-A
dannD
.Wenn Sie sich erneut am Computer anmelden, stellen Sie die Verbindung durch Ausführen wieder her
screen -D -R
. Sie befinden sich in derselben Shell wie zuvor.jobs
Wenn Sie dies getan haben, können Sie den angehaltenen Prozess ausführen , um%1
ihn wieder in den Vordergrund zu stellen.quelle
Sie können "Besitz" des Programms von der Shell mit dem
disown
eingebauten widerrufen :Dies weist die Shell jedoch nur an, beim Beenden der Shell kein
SIGHUP
Signal an das Programm zu senden . Das Programm behält alle Verbindungen zum Terminal bei, normalerweise als Standardeingabe-, Ausgabe- und Fehlerdatenströme. Es gibt keine Möglichkeit, diese an ein anderes Terminal anzuschließen. (Der Bildschirm emuliert ein Terminal für jedes Fenster, sodass die Programme an das Bildschirmfenster angehängt werden.)Es ist möglich , die filedescriptors in eine andere Datei wieder zu befestigen , indem das Programm in einem Debugger Befestigung (dh unter Verwendung
ptrace
) und nennen es machenopen
,dup
undclose
. Es gibt einige Tools, die dies tun. Dies ist ein kniffliger Prozess, und manchmal stürzt der Prozess stattdessen ab. Folgende Möglichkeiten stehen zur Verfügung: (Links, die aus Antworten auf " Wie kann ich einen laufenden Prozess verbergen und einer neuen Bildschirmshell zuordnen?" Und " Kann ich einen bereits gestarteten Prozess nicht starten / überprüfen" ):quelle
disown
Entfernt den Prozess aus der Jobsteuerungsliste.disown -h
?fg
oderkill
es, und sehen, ob es von selbst endet.bzcat a.bz2 | grep text
) zusammen? Mann fürreptyr
sagt, dass es nicht unterstützt, die Prozesse mit Kindern zu verschieben.Um einen Prozess zwischen Terminals zu verschieben oder einen nicht besessenen erneut anzuschließen , können Sie z . B. Reptyr verwenden .
quelle
screen
Antwort natürlich ideal ist, beantwortet sie nicht die Frage, die speziell nach einer Möglichkeit zum Verschieben eines aktuell ausgeführten Prozessesscreen
oder dergleichen verlangt . Siehe auch diese Antwort: serverfault.com/a/284795Meine bevorzugte Lösung ist die Verwendung von
tmux
. Sie können die Sitzung trennen und in einem anderen Terminal erneut anfügen.Wenn Sie sich von der vorherigen Sitzung getrennt haben, können Sie das Terminal sicher schließen. später verwenden
tmux attach
, um zur Sitzung zurückzukehren, auch wenn Sie sich abgemeldet haben.quelle
Es gibt auch ein kleines Hilfsprogramm namens retty , mit dem Sie laufende Programme an ein anderes Terminal anschließen können.
quelle
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, das es bietet, ist die Möglichkeit, einen Prozess in ein Fenster zu importierenquelle
ptrace
), manipuliert aber nicht nur die Dateideskriptoren, sondern gibt den Prozess vor. Es ist in der Lage zu greifenfind /
, stürzte aber eine interaktive Bash.Wenn Sie es nur anhalten und anschließend neu starten möchten, können Sie
kill
mitSTOP
oderCONT
signalisieren.Finden Sie zuerst die Prozesse PID mit
Senden Sie dann die Signale an die PID, die für den Prozess aufgelistet ist
quelle
"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 es zuvor gewusst haben und screen oder tmux ausgeführt haben
Aus der README:
quelle
Das hat bei mir funktioniert:
bg
der Prozessjobs -l
Prozessnummer findentmux
Starten Sie den Shell Window Managerreptyr -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:
Und mit -L
quelle