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

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

$ example &

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

$ jobs

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

2 ответа

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

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

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

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

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

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

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

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

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

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

Другие вопросы по тегам