`watch -n 100' sh script.sh >> /path/to/output/output.txt`はoutput.txtを書きませんか?

`watch -n 100' sh script.sh >> /path/to/output/output.txt`はoutput.txtを書きませんか?

現在、以下を行っています。

watch -n 100 'sh script.sh >> /path/to/output/output.txt' &

30分間実行されましたが(を使用して確認できますps -ef | grep watch)、何も記録されません/path/to/output/output.txt(ファイルは存在しません)。script.sh端末に印刷するコマンドを実行すると、>>すべてが端末に渡されてはいけませんかoutput.txt

答え1

仮説

あなたのものがwatch止まりました。解釈されたシェルを起動する前に停止しますsh script.sh >> /path/to/output/output.txt。リダイレクトがまだ発生していないため、ファイルは存在しません。sh script.shまだ始まっていません。


確認する

対話型シェルでジョブが停止したことを通知した可能性があります。おそらくメッセージを逃したでしょう。電話jobsすると、あなたのwatchisが表示されるはずですStopped


説明する

停止した理由は、watchSIGTTOUを受信したためです。 SIGTTINとSIGTTOUは、デフォルトで端末から読み取るか、または端末に書き込もうとするバックグラウンドプロセス(つまり、フォアグラウンドプロセスグループに属していないプロセス)を停止する信号です。通常、端末は書き込みを試みるバックグラウンドプロセスにSIGTTOUを送信しないように設定されていますが(動作しますdate &)。バックグラウンドプロセスが端末を設定しようとすると、とにかくSIGTTOUを受け取ります。。完全なメカニズムは、バックグラウンドプロセスが端末入力を盗んだり変調したりするのを防ぎます。

watch非常に早く端末を設定しようとしました。watchバックグラウンドで実行すると(watch … &必要に応じて)SIGTTOUを受信して​​停止します。この操作を試みるとbg再びブロックされます。これを試みると、fgフォアグラウンドにインポートして端末と対話することができ、SIGTTOUを受信せずに動作します。


結論として

watchバックグラウンドで実行されるわけではありません。


タスクの代替

単純なループを使用してください。

while sleep 100; do … done > … &

関連情報