Почему фоновые процессы иногда прекращаются самопроизвольно?

10

Иногда, через некоторое время после того, как я создал фон для процесса с помощью bgbash, когда я нажимаю Enter в той же оболочке, чтобы снова отобразить приглашение (просто чтобы убедиться, что я все еще нахожусь в bash, когда отображается какой-то вывод из фонового процесса), кажется, что фоновый процесс останавливается самопроизвольно.

Если я делаю bgснова, та же проблема повторяется.

Единственный способ исправить это , кажется fg.

Почему это происходит?

Робин Грин
источник
Куда идет ваш выход? Вы где-нибудь заполняете буфер?
Пол Томблин

Ответы:

12

Обычно это происходит, если процесс пытается прочитать из своего stdinпотока. Когда процесс находится в фоновом режиме, он получает сигнал TTIN и, таким образом, останавливается (то же самое, что и сигнал STOP). Существует также двойной сигнал TTOU, когда фоновый процесс пытается выполнить запись на свой терминал.

Вывод его на передний план возобновляет процесс и позволяет ему читать с вашего терминала.

Демо-версия:

$ cat t.sh
#! /bin/sh
sleep 1
read dummy
$ ./t.sh &
[1] 3364
$ 
[1]+  Stopped                 ./t.sh
$ ps aux|grep t.sh
me  3364  0.0  0.0  11268  1200 pts/0    T    17:04   0:00 /bin/sh ./t.sh

Одним из способов избежать этого является использование nohup, но это может иметь странные последствия, если программа не справляется с перенаправлением входного потока /dev/null.

Мат
источник