Ist es möglich, den Vordergrundprozess in den Hintergrund zu stellen, ohne ihn anzuhalten (Strg + z)?

11

Ich führe eine Anwendung aus, die TCP- und UDP-Pakete empfängt und daher nicht angehalten werden kann. Ich habe ursprünglich 3 Prozesse derselben Anwendung mit unterschiedlichen Argumenten im Hintergrundmodus ausgeführt &. Als ich das nur tat $fg, standen alle drei Prozesse im Vordergrund. Jetzt möchte ich sie wieder in den Hintergrund schicken, aber ohne Unterbrechung. Wie kann ich das machen?

rahul.deshmukhpatil
quelle
Hier ist ein ServerFault-Thema über das Verschieben eines laufenden Prozesses auf eine neue Bildschirminstanz -> serverfault.com/questions/55880/…
Alan Barber

Antworten:

10

Das Wichtigste zuerst: Es kann nur einen Prozess im Vordergrund geben, nicht alle drei. fgbringt den neuesten Prozess in den Vordergrund. Um den Prozess von Ctrl+ zu beschleunigen zund dann bgschneller zu tippen , um die betreffende Anwendung nicht zu "stören" (beachten Sie, dass der Prozessplaner dies ohnehin mehrmals pro Sekunde ausführt), ermitteln Sie die PID des Prozesses im Vordergrund und dann in einem zweiten Terminal / SSH-Sitzung verwenden

kill -SIGSTOP »pid« ; kill -SIGCONT »pid«

Ihr ursprüngliches Terminal sagt dies stopped, aber da Sie SIGCONTsofort eine gesendet haben , wird der Prozess im Hintergrund fortgesetzt.

Stefan Seidel
quelle
1
@stefen: Ihre Lösung überzeugt. Es wird meine Prozesse in keiner Weise beeinträchtigen, vorausgesetzt, wenn wir den Prozess unterbrechen, werden die hergestellten Socket-Verbindungen nicht unterbrochen (die Scheduler-Umschaltung trennt die Socket-Verbindung nicht, da bin ich mir sicher). Wird dies debuggen und aktualisieren. Vielen Dank. If
rahul.deshmukhpatil
2

Wenn Sie wirklich einen Vordergrundjob haben, wartet bash darauf, dass er abgeschlossen wird. Dies ist mehr oder weniger die Definition eines Vordergrundjobs . Wenn bash hat immer noch die Kontrolle über das Terminal, zu überprüfen , was mit passiert jobs -l, zum Beispiel:

$ ncat -kl -p 10111 &
[1] 13404
$ ncat -kl -p 10222 &
[2] 13405
$ ncat -kl -p 10333 &
[3] 13406
$ jobs -l
[1]  13404 Running                 ncat -kl -p 10111 &
[2]- 13405 Running                 ncat -kl -p 10222 &
[3]+ 13406 Running                 ncat -kl -p 10333 &

Ich habe dafür drei Hintergrund- ncatHörprozesse gestartet . Möglicherweise wird für einen Auftragsstatus auch "Fertig" oder "Gestoppt" angezeigt.

Mit der SIGSTOP / SIGCONT-Methode von Stefan Seidel können Sie einen Vordergrundjob aus einer anderen Shell effektiv in den Hintergrund stellen (obwohl das tatsächliche Signal, das von einer Shell mit Ctrl- gesendetZ wird, SIGTSTP ist, sollte jedes Signal funktionieren).

Es gibt eine subtile Unterscheidung zwischen Prozessen und Jobs, wenn die Begriffe Vordergrund und Hintergrund verwendet werden. Es gibt nur einen Shell- Vordergrundjob , es können mehrere Vordergrundprozesse vorhanden sein (dies hängt mit den IDs der Terminalprozessgruppen zusammen und kann beobachtet werden, wenn Sie zwei oder mehr Prozesse in einer Pipeline starten).

Ein laufender Prozess oder eine laufende Pipeline unter der Kontrolle der Shell wird als "Job" bezeichnet. Wenn Sie den Befehl bgoder verwenden, verweisen fgSie implizit auf den neuesten Job - in meinem Fall den mit +dem oben genannten. Diese Jobs können auch (unter anderem) explizit als% 1% 2 oder% 3 (die Zahl in []) bezeichnet werden.

Ein nicht qualifizierter fgBefehl wirkt sich nur auf einen Job aus, den neuesten, sodass Sie sich möglicherweise in Ihrem Verständnis der aktuellen Situation irren. Ein Hintergrundjob kann weiterhin in das Terminal schreiben:

  echo foo > /dev/tcp/127.0.0.1/10111

Es kann davon abhängen, wie das Programm mit dem Terminal umgeht, ncatfunktioniert gut zum Schreiben. Wenn Sie jedoch lesen, dass Programme die Ausführung stoppen, wird die Meldung "Gestoppt" angezeigt. Die Shell startet Prozesse und wartet darauf, dass sie beendet werden oder ein SIGTTIN-Signal empfangen (dies nohupist ein Weg, wie es ist disown).

Sie können einen bestimmten gestoppten Job mit Hintergrundinformationen erstellen

$ bg %3

(In meinem Fall bekomme ich den Fehler bash: bg: job 3 already in background)

Andernfalls, wenn ein Prozess im Vordergrund steht, ist es unwahrscheinlich, dass es Probleme mit einem schnellen Ctrl- Zund gibt, es sei denn, das Programm fängt SIGTSTP ab und macht etwas Besonderes bg. Netzwerkprogramme haben in dieser Hinsicht nichts Besonderes, eingehende Verbindungen / Daten werden vom Kernel (bis zu einem gewissen Punkt) gepuffert. Eine Streaming-Verbindung kann jedoch eine beobachtbare Pause haben.

Weitere Informationen finden Sie im Abschnitt " JOB CONTROL " der Bash-Manpage.

mr.spuratic
quelle
1

Der einfachste Weg, dies zu tun, ist die Verwendung des Bildschirmprogramms . Sie können Ihre Anwendung im virtuellen Terminal starten und dann den Bildschirm mit Strg + A, D verlassen. Wenn Sie Ihre Sitzung fortsetzen möchten, geben Sie Ihren Typ ein screen -x. Wenn Sie mehrere Prozesse haben, wird eine Liste mit Bildschirmen angezeigt, an die Sie erneut anhängen können. Weitere Informationen finden Sie auf der Manpage des Bildschirms .

Janos Pasztor
quelle
5
Ich denke, er sucht "nachträglich" nach einer Lösung, dh die Prozesse laufen gerade.
Stefan Seidel