コマンドを呼び出して待ってから別のコマンドを実行してください。

コマンドを呼び出して待ってから別のコマンドを実行してください。

これはストリーム(標準入力)を観察し、行が入るとしばらく待ってからコマンドを実行し、もう少し待つ必要がある状況のように感じます。

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-progresstouch /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

関連情報