現在、以下を行っています。
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
すると、あなたのwatch
isが表示されるはずですStopped
。
説明する
停止した理由は、watch
SIGTTOUを受信したためです。 SIGTTINとSIGTTOUは、デフォルトで端末から読み取るか、または端末に書き込もうとするバックグラウンドプロセス(つまり、フォアグラウンドプロセスグループに属していないプロセス)を停止する信号です。通常、端末は書き込みを試みるバックグラウンドプロセスにSIGTTOUを送信しないように設定されていますが(動作しますdate &
)。バックグラウンドプロセスが端末を設定しようとすると、とにかくSIGTTOUを受け取ります。。完全なメカニズムは、バックグラウンドプロセスが端末入力を盗んだり変調したりするのを防ぎます。
watch
非常に早く端末を設定しようとしました。watch
バックグラウンドで実行すると(watch … &
必要に応じて)SIGTTOUを受信して停止します。この操作を試みるとbg
再びブロックされます。これを試みると、fg
フォアグラウンドにインポートして端末と対話することができ、SIGTTOUを受信せずに動作します。
結論として
watch
バックグラウンドで実行されるわけではありません。
タスクの代替
単純なループを使用してください。
while sleep 100; do … done > … &