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


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

これを回避する方法の1つはを使用するnohupことですが、プログラムが入力ストリームのリダイレクトに対処しない場合、これは奇妙な影響を与える可能性があり/dev/nullます。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.