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?
11
Antworten:
Das Wichtigste zuerst: Es kann nur einen Prozess im Vordergrund geben, nicht alle drei.
fg
bringt den neuesten Prozess in den Vordergrund. Um den Prozess von Ctrl+ zu beschleunigen zund dannbg
schneller 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 verwendenIhr ursprüngliches Terminal sagt dies
stopped
, aber da SieSIGCONT
sofort eine gesendet haben , wird der Prozess im Hintergrund fortgesetzt.quelle
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:Ich habe dafür drei Hintergrund-
ncat
Hö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
bg
oder verwenden, verweisenfg
Sie 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
fg
Befehl 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:Es kann davon abhängen, wie das Programm mit dem Terminal umgeht,
ncat
funktioniert 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 (diesnohup
ist ein Weg, wie es istdisown
).Sie können einen bestimmten gestoppten Job mit Hintergrundinformationen erstellen
(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.
quelle
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 .quelle