Подтвердить что ты не робот

Процесс Linux в фоновом режиме - "Остановлен" на рабочих местах?

В настоящее время я запускаю процесс со знаком &.

$ example &

Однако (обратите внимание, что я новичок в Linux). Я понял, что через секунду после такой команды я получаю заметку о том, что мой процесс получил сигнал остановки. Если я делаю

$ jobs

Я получу список с моим примером с небольшой запиской "Stopped". Действительно ли он остановлен и вообще не работает на заднем плане? Как это работает? Я получаю смешанную информацию из Интернета.

4b9b3361

Ответ 1

В Linux и других Unix-системах задание, выполняемое в фоновом режиме, но все еще имеющее stdin (или std::cin), связанное с его управляющим терминалом (иначе оно было запущено), будет отправлено SIGTTIN, который по умолчанию заставляет программу полностью останавливаться, до тех пор, пока пользователь не выведет ее на передний план (fg %job или аналогичный), чтобы разрешить ввод данных в программу. Чтобы избежать приостановки программы таким образом, вы можете:

  • Убедитесь, что канал программы stdin больше не связан с терминалом, либо перенаправляя его в файл с соответствующим содержимым для ввода программы, либо в /dev/null, если он действительно не требует ввода - например. myprogram < /dev/null &.
  • Выйдите из терминала после запуска программы, что приведет к исчезновению связи с программой stdin. Но это приведет к доставке SIGHUP в программу (это означает, что канал ввода-вывода испытывал "зависание" ) - это обычно приводит к завершению работы программы, но этого можно избежать, используя nohup - например. nohup myprogram &.

Если вы вообще заинтересованы в захвате вывода программы, это, вероятно, лучший вариант, поскольку он предотвращает оба вышеупомянутых сигнала (а также пару других) и сохраняет вывод для вас, чтобы посмотреть на чтобы определить, есть ли проблемы с выполнением программ:

nohup myprogram < /dev/null > ${HOME}/myprogram.log 2>&1 &

Ответ 2

Да, он действительно остановлен и больше не работает в фоновом режиме. Чтобы вернуть его к жизни fg job_number

Ответ 3

Просто введите fg чтобы устранить ошибку, когда вы попытаетесь выйти.

Ответ 4

Из того, что я могу собрать.

Фоновые задания заблокированы от чтения пользовательского терминала. Когда кто-то пытается это сделать, он будет приостановлен, пока пользователь не выведет его на передний план и не предоставит некоторый ввод. "чтение из пользовательского терминала" может означать либо прямую попытку чтения из терминала, либо изменение настроек терминала.

Обычно это то, что вам нужно, но иногда программы читают данные с терминала и/или изменяют настройки терминала не потому, что для продолжения требуется ввод данных пользователем, а потому, что они хотят проверить, пытается ли пользователь предоставить ввод.

http://curiousthing.org/sigttin-sigttou-deep-dive-linux имеет ужасные технические детали.