コマンド直列化スクリプト
並列で動いているバッチプロセスが叩く外部コマンド(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 が必要。