Czy można umieścić proces pierwszego planu w tle bez zawieszania (control + z)?

11

Korzystam z aplikacji, która odbiera pakiety TCP i UDP i dlatego nie można jej zawiesić. Celowo uruchomiłem 3 procesy tej samej aplikacji, z różnymi argumentami, w trybie tła za pomocą &. Gdy tylko to zrobiłem $fg, wszystkie trzy procesy weszły na pierwszy plan. Teraz chcę wysłać je ponownie w tło, ale bez zawieszenia. Jak mogę to zrobić?

rahul.deshmukhpatil
źródło
Oto temat ServerFault dotyczący przeniesienia działającego procesu do nowej instancji ekranu -> serverfault.com/questions/55880/…
Alan Barber

Odpowiedzi:

10

Po pierwsze: na pierwszym planie może być tylko jeden proces, a nie wszystkie trzy. fgprzenosi najnowszy proces na pierwszy plan. Aby proces Ctrl+ z, następnie pisanie było bgszybsze, aby nie „zakłócać” danej aplikacji (zauważ, że planista procesu i tak zrobi to wiele razy na sekundę), znajdź PID procesu na pierwszym planie, a następnie na drugim terminalu / Sesja SSH, użyj

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

Twój oryginalny terminal powie stopped, ale ponieważ wysłałeś SIGCONTod razu, proces będzie nadal działał w tle.

Stefan Seidel
źródło
1
@stefen: twoje rozwiązanie jest przekonujące. W żaden sposób nie zaszkodzi moim procesom, zakładając, że jeśli zawiesimy proces, wówczas ustanowione połączenia gniazd nie ulegają zerwaniu (przełączanie harmonogramu nie rozłącza połączenia gniazd, jestem tego pewien). Debuguje to i zaktualizuje. Wielkie dzięki. Jeśli
rahul.deshmukhpatil
2

Jeśli naprawdę masz zadanie na pierwszym planie, bash czeka na jego zakończenie, to mniej więcej definicja zadania na pierwszym planie . Jeśli bash nadal ma kontrolę nad terminalem, sprawdź, co się dzieje jobs -l, np .:

$ 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 &

Zacząłem trzy tła ncat procesy nasłuchiwania w . Możesz także zobaczyć „Gotowe” lub „Zatrzymane” dla statusu zadania.

Możesz efektywnie ustawić tło zadania pierwszego planu z innej powłoki, używając metody SIGSTOP / SIGCONT Stefana Seidela (chociaż faktyczny sygnał wysyłany przez powłokę z Ctrl- Zto SIGTSTP, oba sygnały powinny działać).

Istnieje subtelne rozróżnienie między procesami i zadaniami, gdy używane są terminy pierwszy plan i tło. Istnieje tylko jedno zadanie na pierwszym planie powłoki , może istnieć wiele procesów na pierwszym planie (jest to związane z identyfikatorami grup procesów terminalowych i można je zaobserwować po uruchomieniu dwóch lub więcej procesów w potoku).

Działające procesy lub potok pod kontrolą powłoki są nazywane „zadaniem”, gdy używasz polecenia bglub fg, domyślnie odwołujesz się do ostatniego zadania - w moim przypadku tego z +powyższym. Te zadania można również (między innymi) jawnie nazwać % 1% 2 lub% 3 (liczba w []).

Niewykwalifikowane fgpolecenie wpłynie tylko na jedno zadanie, ostatnie, więc możesz się mylić, rozumiejąc obecną sytuację. Zadanie w tle może nadal zapisywać w terminalu:

  echo foo > /dev/tcp/127.0.0.1/10111

Może to zależeć od tego, jak program obsługuje terminal, ncatdziała dobrze do pisania. Podczas czytania programy zatrzymają się, a zobaczysz komunikat „Zatrzymano”. Powłoka uruchomi procesy i zaczeka, aż wyjdą lub otrzymają sygnał SIGTTIN (jak na razie nohupjest to obejście disown).

Możesz ustawić tło określonego zatrzymanego zadania w tle

$ bg %3

(w moim przypadku otrzymam błąd bash: bg: job 3 already in background)

W przeciwnym razie, jeśli proces jest na pierwszym planie, chyba że program złapie SIGTSTP i zrobi coś specjalnego, prawdopodobnie nie będzie miał problemów z szybkim Ctrl- Zi bg. Pod tym względem nie ma nic specjalnego w programach sieciowych, połączenia przychodzące / dane będą buforowane przez jądro (do pewnego momentu). Połączenie strumieniowe może jednak mieć zauważalną pauzę.

Aby uzyskać więcej informacji, zobacz sekcję „ KONTROLA ZADAŃ ” na stronie podręcznika bash.

pan. spuratic
źródło
1

Najłatwiejszym sposobem na to jest skorzystanie z programu ekranowego . Możesz uruchomić aplikację w wirtualnym terminalu, a następnie wyjść z ekranu za pomocą Ctrl + A, D. Jeśli chcesz wznowić sesję, wpisz swój typ screen -x. Jeśli masz wiele procesów, zostanie wyświetlona lista ekranów do ponownego podłączenia. Aby uzyskać więcej informacji, przeczytaj stronę man screen .

Janos Pasztor
źródło
5
Myślę, że szuka rozwiązania „po fakcie”, tj. Procesy są teraz uruchomione.
Stefan Seidel