BASHおよびwatchコマンドを使用して定期的なタスクを実行する

BASHおよびwatchコマンドを使用して定期的なタスクを実行する

watchコマンドを使用してローカルのgitリポジトリでリモートポイントの変更を監視し、タスクを実行することを目的としてBASHスクリプトを作成しようとしています。

スクリプトが呼び出され、task.sh次のように仮定します。

watch -n 3000 (git remote update && git status) | \
grep -i "your branch is behind origin/" && \ 
{ "pull changes, run tests, etc." ; }

私が投稿したものはこれまでのものと似ていますが、最後の部分が正しく機能していないようです。つまり、gitブランチを変更しても起動しないようです。出力をwatchそのファイルにリダイレクトできますが、watch -n 3000 ls 1>> file.txtこの方法を使用するにはファイルを開く必要があるため、遅く、エラーが発生しやすくなります。

デフォルトでは、スクリプトを起動したスクリプトが終了するまで実行を続けたいと思います。しかし、それより良い方法がwatchあればそれも良いでしょう。watch

ベストアンサー1

DopeGhotiが述べたように、cronこれはより良い選択になります。

あなたの例にはすでに50分間隔があります。間隔を1時間に設定することが許可されている場合、多くの最新のディストリビューションには/etc/cron.hourlyディレクトリがあります。実行可能ビットが設定されているディレクトリ内のすべてのエントリは毎時間実行されます(私が見たほとんどの実装では、そのrun-partsディレクトリ内のファイル名で線形に実行される実行可能ファイルを使用します)。

間隔を短くする必要がある場合はお勧めします/etc/cron.d。 cronデーモンは通常このディレクトリを直接解析するため、実行可能ビットを設定する必要はありません。task次の内容でファイルを作成できます。

*/30 * * * * root /path/to/task.sh

最初の5つのフィールドは、分、時間、日付、月、曜日を表します。この例では、分に30分ステップ値を指定します。したがって、この特定の例は、task.sh30分ごと、毎時間、毎月毎日実行されます。アイデアを得ることができます。

30分を超える分フィールドのステップ値は、N時間後の分で実行されます。ここでは、N分フィールドの値です。

バラよりここ奇数間隔のソリューションです。

今bashコードを見てください...

これが期待どおりに機能しない理由は、grep評価する終了値が返されないためです&&。それでもgrep出力中ですwatch

これは以下の例で見ることができます。中括弧echo内の合計がsleep置き換えられますwatchsleep終了後も可能ですgrep。 2番目の日付は終了が完了するまで実行されず、grep終了コードを評価できます。

[vagrant@localhost ~]$ date +%s; { echo a; sleep 15; } | grep 'a' && date +%s
1493875975
a
1493875990

この問題を解決する1つの方法は、すべてを内部に移動することですwatch

watch -n 15 'bash -c "echo a | grep 'a' && date +%s"'

別のオプションは、while-true-loopを使用することです。

[vagrant@localhost ~]$ while :; do echo a | grep 'a' && date +%s; sleep 15; done
a
1493875992
a
1493876007
a
1493876022
^C

おすすめ記事