「ウォッチ」をバックグラウンドジョブとして実行する方法は?

「ウォッチ」をバックグラウンドジョブとして実行する方法は?

私が実行したとき:

watch 'cmd >> output.txt' &

ジョブがシステムによって一時停止されました。

3569停止(tty出力)

解決策はありますか?

答え1

watchの目的watchは、コマンドの結果を全画面表示して更新を続けることです。出力をファイルにリダイレクトしてバックグラウンドにドロップすると、当初はウォッチを使用する理由はありません。

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

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

答え2

@SDKのおかげで更新されます。

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

teeは非常に便利で、出力を指定されたファイルにプッシュします。

前の答え:

方法は次のとおりです。

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

プロセスをバックグラウンドに配置するので、端末の表示は不要で、ファイルにリダイレクトするのが良いと仮定できます。これにより、watch問題なく背景に入ることができます。

sleepMichael Mrozekが提案したように、ゆっくりと遅れてしまい、おそらく望ましくないでしょう。システム時間を監視し、経過時間に応じてコマンドを実行する複雑なシェルスクリプトに加えて、watch -p正確なタイミングに最適です。

正確なタイミングのために:

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

答え3

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

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

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

答え4

動機によって異なります。

  • 定期的に何かを実行したいです。その後、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 
      
    • 組み合わせることがscreenできるので、watch1画面に合う限り常に最新の状態を見ることができます。

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

関連情報