コマンド直列化スクリプト
並列で動いているバッチプロセスが叩く外部コマンド(ffmpeg)がメモリーをバカ食いするケースが有って、タイミングが重なるとサーバーメモリーが枯渇するのでそこだけ直列化した。
作ってみたら便利だったので記事にした
#!/usr/bin/bash set +e PID_FILE=/tmp/`echo $1 | sed 's/\//_/g'`.pid LOCK_FILE=/tmp/`echo $1 | sed 's/\//_/g'`.lock WAITING='1' while [ "$WAITING" = '1' ]; do if [ -e $LOCK_FILE ]; then echo 'Locked' sleep 1 continue fi touch $LOCK_FILE exec 9> $LOCK_FILE flock -n 9 if [ "$?" = "1" ]; then echo 'Flocked' sleep 1 continue fi WAITING="0" echo touch $LOCK_FILE if [ -e $PID_FILE ]; then PID=`cat $PID_FILE` if [ "$PID" != '' ]; then ps -v -p $PID | grep -c $1 > /dev/null if [ "$?" = "0" ]; then echo "Wait for $PID ($1)" WAITING='1' rm $LOCK_FILE sleep 1 fi fi fi done echo '====START====' echo "$*" $* & echo $! > $PID_FILE rm $LOCK_FILE set -e wait `cat $PID_FILE` echo '====END===='
mac の場合は brew install flock
が必要。