Edited at

時間のかかるMakefileで重複処理を防止する

More than 1 year has passed since last update.

Makefile 便利ですよね

僕はcronと併せて使っています

こんな感じです


crontab

*/5 * * * * make sync

5 * * * * make clean


Makefile


sync:
rsync -auz /opt/data remotesite:/opt/remote-data/

clean:
find /opt/data -mtime +3 -type f -exec rm {} \;


でもひとつ困ったことがあって

rsync に予想以上の時間がかかったりすると

処理が終わらないうちに次のサイクルでcron処理がスタートしたりして

いつのまにかプロセスが以上に大量発生してしまう事なんです。

そうすると負荷が異常に大きくなってログインできなくなったりフリーズしてしまったりします。

なので make sync が実行された時に重複して実行されるのを防止したいわけです。

試行錯誤の末 今は次のような方法に落ち着いています


Makefile


sync:
kill -0 `tail -1 sync.pid` || $(MAKE) sync_do

sync_do:
ps -p $$$$ -o ppid > sync.pid
rsync -auz /opt/data remotesite:/opt/remote-data/

clean:
find /opt/data -mtime +3 -type f -exec rm {} \;


make sync_do を実行するときのPID が sync.pid に保存されるので そのプロセスが生きているかどうかで重複の判定を行っています

似たような状況は色々あって重複実行を防ぎたいケースってちょくちょくあります

厳密なやり方もあるのでしょうが、簡単な方法が欲しい場合もありますよね?

Makefile 以外にも bash スクリプトでもできます