中年engineerの独り言 - crumbjp

LinuxとApacheの憂鬱

コマンド直列化スクリプト

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