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.sh
30分ごと、毎時間、毎月毎日実行されます。アイデアを得ることができます。
30分を超える分フィールドのステップ値は、N
時間後の分で実行されます。ここでは、N
分フィールドの値です。
バラよりここ奇数間隔のソリューションです。
今bashコードを見てください...
これが期待どおりに機能しない理由は、grep
評価する終了値が返されないためです&&
。それでもgrep
出力中ですwatch
。
これは以下の例で見ることができます。中括弧echo
内の合計がsleep
置き換えられますwatch
。sleep
終了後も可能です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