Процесс Linux в фоновом режиме - "Остановлен" на рабочих местах?
В настоящее время я запускаю процесс со знаком &
.
$ example &
Однако (обратите внимание, что я новичок в Linux). Я понял, что через секунду после такой команды я получаю заметку о том, что мой процесс получил сигнал остановки. Если я делаю
$ jobs
Я получу список с моим примером с небольшой запиской "Stopped". Действительно ли он остановлен и вообще не работает на заднем плане? Как это работает? Я получаю смешанную информацию из Интернета.
Ответы
Ответ 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 имеет ужасные технические детали.