Процесс Linux в фоновом режиме - "Остановлен" на рабочих местах?
В настоящее время я запускаю процесс с &
знак.
$ example &
Однако (обратите внимание, что я новичок в Linux), я понял, что через секунду после такой команды я получаю сообщение, что мой процесс получил сигнал остановки. Если я сделаю
$ jobs
Я получу список с моим примером процесса с небольшой заметкой "Остановлено". Действительно ли он остановлен и вообще не работает в фоновом режиме? Как это работает? Я получаю смешанную информацию из Интернета.
2 ответа
В 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 &
Да, он действительно остановлен и больше не работает в фоновом режиме. Чтобы вернуть его к жизни типа fg
номер_задания
Из того, что я могу собрать.
Фоновые задания заблокированы от чтения пользовательского терминала. Когда кто-то пытается это сделать, он будет приостановлен, пока пользователь не выведет его на передний план и не предоставит некоторый ввод. "чтение из пользовательского терминала" может означать либо прямую попытку чтения из терминала, либо изменение настроек терминала.
Обычно это то, что вам нужно, но иногда программы читают данные с терминала и / или изменяют настройки терминала не потому, что для продолжения требуется ввод данных пользователем, а потому, что они хотят проверить, пытается ли пользователь предоставить ввод.
http://curiousthing.org/sigttin-sigttou-deep-dive-linux имеет ужасные технические детали.
Просто введите fg
которая устранит ошибку, когда вы попытаетесь выйти.