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


回答:


26

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

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

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

ただし、これをブロックしない方法で行う方法はありますか?たとえば、これと他のコマンドを単一のbashスクリプトに入れて、この後のコードを実行し続けたい場合(バックグラウンドでこれを実行します)?
オースティン

14

方法は次のとおりです。

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

プロセスをバックグラウンドで実行するため、ターミナルディスプレイは不要であり、ファイルへのリダイレクトは問題ないと想定できます。これを行うと、watch問題なくバックグラウンドを実行できます。

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

正確なタイミング:

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

申し訳ありませんが、これはどのように機能しますか?なぜ&2回だけ使用することが可能ですか?
phil294

のパイプラインセクションを読んで、man bash最初の&仕組みを確認してください。;)
ミオリイン

11

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

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

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


2

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

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

2

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

  • 何かを定期的に実行したい。次に、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


0

使用する必要がある場合watch- マイクダンジェロl0b0からの回答を組み合わせるだけ

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

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

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