9

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

3 ответа3

10

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

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

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

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 . Если у вас есть несколько процессов, вам будет представлен список экранов для подключения. Для более подробной информации, пожалуйста, прочитайте справочную страницу экрана .

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .