web-dev-qa-db-ja.com

バックグラウンドプロセスが自然に停止することがあるのはなぜですか?

時々、bashでbgを使用してプロセスをバックグラウンド処理した後、同じシェルでEnterキーを押してプロンプトを再表示すると(バックグラウンドからの出力時にまだbashにいることを確認するためだけに)プロセスが表示されています)、バックグラウンドプロセスが自然に停止しているようです。

もう一度bgを実行すると、同じ問題が再発します。

それを修正する唯一の方法はfgのようです。

なぜこれが起こるのですか?

10
Robin Green

これは通常、プロセスが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

これを回避する方法の1つは Nohup を使用することですが、プログラムがその入力ストリームを/dev/null

12
Mat