Dlaczego procesy działające w tle czasami zatrzymują się spontanicznie?

10

Czasami, jakiś czas po tym, jak stworzyłem proces bgw tle w trybie bash, kiedy naciskam Enter w tej samej powłoce, aby ponownie wyświetlić monit (tylko po to, aby sprawdzić, czy nadal jestem w bash, gdy wyświetlane są dane wyjściowe z procesu w tle), proces w tle wydaje się kończyć spontanicznie.

Jeśli bgpowtórzę, ten sam problem się powtórzy.

Wydaje się, że to jedyny sposób, aby to naprawić fg.

Dlaczego to się dzieje?

Robin Green
źródło
Dokąd zmierza twoja produkcja? Czy gdzieś wypełniasz bufor?
Paul Tomblin,

Odpowiedzi:

12

Zwykle dzieje się tak, gdy proces próbuje odczytać ze swojego stdinstrumienia. Gdy proces jest w tle, odbiera sygnał TTIN i jest w ten sposób zamrożony (to samo zachowanie, co sygnał STOP). Istnieje również podwójny sygnał TTOU, gdy proces w tle próbuje zapisać na swoim terminalu.

Przeniesienie go na pierwszy plan wznawia proces i pozwala na odczyt z terminala.

Próbny:

$ 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

Jednym ze sposobów uniknięcia tego jest użycie nohup, ale może to mieć dziwne efekty, jeśli program nie poradzi sobie z przekierowaniem strumienia wejściowego /dev/null.

Mata
źródło