web-dev-qa-db-ja.com

「watch」をバックグラウンドジョブとして実行するにはどうすればよいですか?

私が走ると:

watch 'cmd >> output.txt' &

ジョブはシステムによって一時停止されます。

3569停止(tty出力)

回避策はありますか?

20
Juliusz

watchの目的は、コマンドの結果をフルスクリーンで表示し、継続的に更新することです。出力をファイルにリダイレクトしてバックグラウンド化する場合、そもそもwatchを使用する理由はまったくありません。

コマンドを遅延して何度も繰り返し実行したい場合(watchはデフォルトで2秒待機します)、次のようなものを使用できます。

while true; do
    cmd >> output.txt
    sleep 2
done
26
Michael Mrozek

ここに方法があります:

watch -n 1 'date' &>/dev/null &

プロセスをバックグラウンドで使用しているので、ターミナルディスプレイは必要なく、ファイルに正しくリダイレ​​クトしていると想定できます。そうすることで、バックグラウンドでwatchを問題なく行うことができます。

sleepは、Michael Mrozekによって示唆されているように、ゆっくり遅れて望ましくありません。システム時間を監視し、経過時間に基づいてコマンドを実行する複雑なシェルスクリプトwatch -pは、正確なタイミングの良いオプションです。

正確なタイミング:

watch -n 1 -p 'date' &>/dev/null &
14
mike dangelo

あなたの動機はわかりませんが、これで十分でしょうか?

while true; do sleep 2; cmd >>output.txt; done &

それ以外の場合は、watchが本当に必要な理由を説明してください。

11

あなたの動機に依存します:

  • 定期的に何かを実行したい。次に、直接cronを使用できます。 (1分という時間の細分性で十分な場合)。

    • 注:間隔が非常に短い場合、またはデバイスが非常に制約されている場合、crondからのメッセージの記録が少なくなるようにsyslogを構成しない限り、syslogはすぐにいっぱいになります。
  • 何かを繰り返し実行したい場合:

    while sleep 2 ; do
      cmd
    done >& log.txt
    

    (たとえば、これはcrontabから実行できますが、スクリプトを使用することを強くお勧めします)。

  • コマンドを定期的に実行し、その最後の実行の出力にアクセスする必要があります。

    • 出力をramfsに書き込むことができます(前にスクリプトを変更します)。

      while sleep 2 ; do
        cmd >& last_execution.log
      done 
      

      またはさらに良い:

      while sleep 2 ; do
        cmd >& last_execution.log.tmp 
        mv last_execution.log.tmp last_execution.log ## atomically
      done 
      
    • screenwatchを組み合わせて、1画面に収まる限り、常に最新のステータスを確認できます。

      screen watch -n 3660 ./make-backup.sh
      

teeはあなたの友達です。たとえば、現在のディレクトリ内のファイル数を表示し、それをcount.txtに2秒ごとに追加する方法は次のとおりです。

watch 'find . -maxdepth 1 -printf " " | wc -c | tee --append count.txt'
2
l0b0

Screenコマンドを使用できます。

http://www.cyberciti.biz/tips/linux-screen-command-howto.html

1
Roberto

watchを使用する必要がある場合-mike dangelol0bからの回答を組み合わせるだけです

watch -n 1 'cmd | tee -a output.txt' &>/dev/null &

例えば.

watch -n 1 'date | tee -a output.txt' &>/dev/null &

次に秒が経過するのを見る

tail -f output.txt
0
SDK

ウォッチは画面に出力するように設計されていますが、出力をリダイレクトして(stdoutとstderrの両方)、バックグラウンドで実行できます。

watch 'date >>fa' >/dev/null 2>/dev/null &
0
X Tian