これはストリーム(標準入力)を観察し、行が入るとしばらく待ってからコマンドを実行し、もう少し待つ必要がある状況のように感じます。
pyinotifyやfswatchなどのツールを使用してフォルダの変更を監視し、見つかったら再エコーすることができます。
fswatch --recursive --latency 2 src/ | xargs make build
または
pyinotify -r -a -e IN_CLOSE_WRITE -c 'make build' src/
make build
私の場合、ファイルが変更されたときにどのように呼び出すかを考えています。上記のツールは機能しますが、make build
すぐに連続して複数回呼び出すことができます。各ツールは少しずつ異なる動作をしますが、最終結果は同じです(makeがあまりにも多く呼び出されます)。
すべてのスピンを停止し、1秒を通過してから一度呼び出すようにしてください。
コマンドをバッチ処理してmakeを呼び出すUnixメソッドはありますか?このような:
fswatch --recursive src/ | aggregate_and_wait --delay 1second | make build
答え1
カナリア(変更を見つけるプロセス)がたとえばステータス/var/run/build-needed
ファイルに書き込まれるようにします。
自動ビルドスクリプトを1分ごと(または5分ごと、またはユースケースに適していると思う頻度)で実行するようにクローンジョブを設定すると、次のことが行われます。
- 確認して
/var/run/build-needed
最新でない場合は/var/run/last-build
中止してください。 - 存在することを確認し、
/var/run/build-in-progress
存在する場合は中止してください。 - 作る
/var/run/build/in-progress
- ビルドを実行します。
- 削除し
/var/run/in-progress
てtouch
/var/run/last-build
。
フレームワークの実装例:
カナリアのプロセス:
pyinotify -r -a -e IN_CLOSE_WRITE -c 'touch /var/run/build-needed' src/
働くcron
:
*/5 * * * * /path/to/autobuilder.sh
ビルダースクリプト:
#!/bin/bash
canaryfile="/var/run/build-needed"
lastbuild="/var/run/last-build"
inprogress="/var/run/build-in-progress"
needbuild="no"
if [[ -f "$canaryfile" ]]; then
if [[ -f "$lastbuild" ]] && [[ "$canaryfile" -nt "$lastbuild" ]]; then
needbuild="yes"
elif ! [[ -f "$lastbuild" ]]; then
needbuild="yes"
fi
fi
if ! [[ -f "$inprogress" && "yes" == "$needbuild" ]]; then
cd /path/to/src
touch "$inprogress"
if make build; then
rm "$inprogress"
touch "$lastbuild"
fi
fi