Чи можна викласти процес переднього плану на задній план без призупинення (контроль + z)?


11

Я запускаю програму, яка отримує пакети TCP та UDP, і тому її неможливо призупинити. Я фактично запускав 3 процеси однієї програми з різними аргументами, використовуючи фоновий режим &. Коли я лише зробив $fg, усі три процеси вийшли на перший план. Тепер я хочу знову надіслати їх на задній план, але без призупинення. Як я можу це зробити?


Ось тема ServerFault про переміщення запущеного процесу до нового екземпляра екрана -> serverfault.com/questions/55880/…
Алан Барбер

Відповіді:


10

По-перше, спочатку: на передньому плані може бути лише один процес, а не всі три. fgвисуває останній процес на перший план. Щоб зробити процес Ctrl+ z, потім введіть bgшвидше, щоб не "заважати" відповідній програмі (зауважте, що планувальник процесів зробить це все одно багато разів на секунду), знайдіть PID процесу на передньому плані, а потім у другому терміналі / SSH сеанс, використання

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

Ваш оригінальний термінал скаже stopped, але оскільки ви відправили SIGCONTвідразу, процес продовжуватиметься у фоновому режимі.


1
@stefen: ваше рішення переконливе. Це жодним чином не зашкодить моїм процесам, припускаючи, що якщо ми зупинимо процес, то встановлені з'єднання сокетів не розриваються (перемикання планувальника не відключає з'єднання сокета, я впевнений у цьому). Налагоджуватимемо це та оновимо. Дуже дякую. Якщо
rahul.deshmukhpatil

2

Якщо у вас справді є робота на передньому плані, тоді Bash чекає його завершення, це більш-менш визначення завдання переднього плану . Якщо bash все ще має контроль над терміналом, перевірте, що відбувається jobs -l, наприклад:

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

Для цього я запустив три фонові ncatпроцеси прослуховування. Ви також можете побачити "Готово" або "Зупинено", щоб отримати статус роботи.

Ви можете ефективно виконати завдання переднього плану з іншої оболонки за допомогою методу SIGSTOP / SIGCONT Стефана Сейделя (хоча фактичний сигнал, що надсилається оболонкою, Ctrl- Zце SIGTSTP, будь-який сигнал повинен працювати).

Існує тонка різниця між процесами та робочими місцями, коли використовуються терміни переднього плану та фону. Є лише одне завдання переднього плану оболонки , може бути декілька процесів переднього плану (це пов'язано з ідентифікаторами групи термінальних процесів , і їх можна спостерігати, коли ви починаєте два або більше процесу в конвеєрі).

Запущені процеси або трубопровід під керуванням оболонки називають "роботою", коли ви використовуєте команду bgабо fgкоманду, ви неявно посилаєтеся на останню роботу - в моєму випадку на ту, що +знаходиться у вищевказаному. Ці завдання також можна (серед іншого) позначати явно як% 1% 2 або% 3 (число в []).

Некваліфікована fgкоманда вплине лише на одну роботу, останню, тому ви можете помилитися в розумінні поточної ситуації. Фонове завдання все ще може записати в термінал:

  echo foo > /dev/tcp/127.0.0.1/10111

Це може залежати від того, як програма обробляє термінал, ncatдобре працює для запису. Для читання, хоча програми припиняють виконання, і ви побачите повідомлення "Зупинено". Оболонка запустить процеси і чекатиме, коли вони вийдуть або приймуть сигнал SIGTTIN ( nohupтакий спосіб, як це є disown).

Ви можете в фоновому конкретних зупинили роботу з

$ bg %3

(у моєму випадку я отримаю помилку bash: bg: job 3 already in background)

В іншому випадку , якщо процес перебуває на передньому плані, якщо програма не ловить SIGTSTP і робить що - щось особливе, це навряд чи буде мати проблеми з швидким Ctrl- Zі bg. У цьому плані мережевих програм немає нічого особливого, вхідні з'єднання / дані будуть забудовані ядром (до точки). Хоча потокове з'єднання може мати помітну паузу.

Детальнішу інформацію див. У розділі " КОНТРОЛЬ РОБОТИ " на сторінці bash man.


1

Найпростіший спосіб для вас це скористатися екранною програмою. Ви можете запустити свою програму у віртуальному терміналі, після чого вийти з екрана за допомогою Ctrl + A, D. Якщо ви хочете відновити сеанс, введіть текст screen -x. Якщо у вас є декілька процесів, вам буде запропоновано список екранів, до яких потрібно повторно долучитись. Для отримання більш детальної інформації, будь ласка, прочитайте сторінку екрана .


5
Я думаю, що він шукає рішення "за фактом", тобто процеси зараз працюють.
Стефан Зайдель
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.