出力サイズによってバックグラウンドジョブが中断されるのはなぜですか?

出力サイズによってバックグラウンドジョブが中断されるのはなぜですか?

完了時に中断され、RETURNキーを押して終了するのを待つストレステストスクリプトが並行して実行されます。調査の結果、これは私のスクリプトに限定されていませんが、bashで実行されるさまざまなスクリプトに適用され、生成された出力サイズによって異なります(少なくとも私のシステムでは正確にUbuntu)。

たとえば、次のようになります。

find . &

十分な出力が生成されたら(より多くの出力のために..または../..の試み)、停止してRETURNキー入力を待ちます。それ以外の場合(つまり、「小さい」出力が生成された場合)、停止せずに終了します。

私の特別なケースではこの機能が不便だと思いますが、これを解決する方法はありますか?

ベストアンサー1

コマンドは中断されません。プロンプトが表示されないため、コマンドが停止したと思います。ヒントはそこにあります。プロンプトはバックグラウンドプロセスの出力によってプッシュされるため表示されません。バックグラウンドプロセスの長い出力の後にEnterを押すと、シェルは空白行を「実行」し、新しいプロンプトを印刷します。

以下を試してください。

  1. 実装するfind . &
  2. 出力が完了するまで待つ
  3. 点滅しているカーソルなどが表示されますが、メッセージは表示されません。
  4. タイプecho foo
  5. Enterキーを押します
  6. foo印刷されたコンテンツと新しいヒントを見る

より多くの実験:

seq 10 &

これにより、1から10までの数字が印刷され、プロンプトが印刷されます。

seq 10000 &

これにより、1から10000までの数字が印刷され、カーソルが点滅し、プロンプトが表示されません。しかし、ヒントがあります。 Enterキーを押すと、印刷された内容と新しいプロンプトがecho foo表示されます。foo

(sleep 2; seq 10) &

このコマンドは、出力は長いが出力は長くないコマンドの待ち時間をシミュレートします。私のシステムでは、次のような効果があります。最初はsleep 2バックグラウンドで実行されます。しばらくすると、シェルはプロンプトを印刷します。そして2秒後にseq 10バックグラウンドで実行されます。これにより、10行が印刷され、プロンプトが上に上がります。これでバックグラウンドタスクが完了します。

したがって、バックグラウンド操作は常に完了し、常にプロンプ​​トが表示されますが、必ずしもプロンプトが表示されるわけではありません。バックグラウンドジョブがすばやく完了すると、シェルは最後に表示されるプロンプトを印刷します。バックグラウンドジョブが出力を印刷するのに時間がかかると、シェルはプロンプトを印刷しましたが、そのプロンプトは表示されなくなるように押し上げられます。

より多くの実験:

試してみるseq 10000 &か、別の大きな数字を入力すると、出力の最後にヒントが表示されません。それでは、この数字の半分を試してみてください。この例ではseq 5000 &。プロンプトを見ましたか?これを行うには、より大きな数字を試してください。たとえばseq 7500 &。メッセージが表示されない場合は、小さい数字を試してください。たとえばseq 2500 &。プロンプトが数行だけプッシュされたことが確認されるまで、この作業を続けます。ここにある内容は実際には競争条件バックグラウンドプロセスとシェルプロセスの間。

おすすめ記事