Можно ли перевести процесс переднего плана в фоновый режим без приостановки (control + 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: ваше решение убедительно. Это никак не повредит моим процессам, если предположить, что если мы приостановим процесс, установленные сокетные соединения не прервутся (переключение планировщика не отключает сокетное соединение, я уверен в этом). Будет отлаживать это и обновлять. Большое спасибо. If
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 для получения более подробной информации.


1

Самый простой способ сделать это - использовать экранную программу. Вы можете запустить свое приложение в виртуальном терминале, а затем выйти из экрана, нажав Ctrl + A, D. Если вы хотите возобновить сеанс, ваш тип screen -x. Если у вас есть несколько процессов, вам будет представлен список экранов для подключения. Для более подробной информации, пожалуйста, прочитайте справочную страницу экрана .


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