時々、bashでbg
を使用してプロセスをバックグラウンド処理した後、同じシェルでEnterキーを押してプロンプトを再表示すると(バックグラウンドからの出力時にまだbashにいることを確認するためだけに)プロセスが表示されています)、バックグラウンドプロセスが自然に停止しているようです。
もう一度bg
を実行すると、同じ問題が再発します。
それを修正する唯一の方法はfg
のようです。
なぜこれが起こるのですか?
これは通常、プロセスが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
。