CakePHPのシェルを簡単に起動&多重起動を禁止するスクリプト

CakePHPをコマンドラインから簡単に起動&多重起動を禁止するシェルスクリプトを作成してみました。

このシェルスクリプトの利点

今回のシェルスクリプトを利用すると、CakePHPのコマンドラインからの起動が以下の点で便利になります。(CakePHPのシェルやタスク機能は、cronやコマンドラインからCakePHPを利用したいときに便利な機能です。)

  • アプリケーションディレクトリのパス(-appオプション)を指定する必要がない。
  • どこからシェルスクリプトを実行しても動作する。
  • ディレクトリ構成の異なるサーバーでも同じシェルスクリプトで動作する(CakePHPのディレクトリ構成が同じ場合)。
  • cronなどを利用している場合に多重起動を防止できる。

参考資料

シェルスクリプトの作成に当たっては、はてなのシェルスクリプトで正しい二重起動チェックを解説しているページ、もしくは方法を教えてください。を参考にしました。シンボリックリンクを排他処理用のロックファイルとして利用する方法になります。

CakePHP用に修正したほか、主に以下の点を変更しています。

  • 同名のシェルスクリプトが実行できるように、絶対パスを基にシンボリックリンクを作成するようにした。
  • サーバーの再起動時にシンボリックリンクが残らないようにした。

CakePHPのディレクトリ構成

CakePHPのディレクトリ構成は以下のようなものを想定しています。構成が異なる場合でも、シェルスクリプト内の設定箇所をCakePHPウェブルート内のindex.phpの設定に合わせて変更すれば動作します。

  • /virtual/user/ (サーバールート)
    • cakephp/
      • 1.3/
        • cake/ (CakePHPコア)
        • plugins/
        • vendors/
      • apps/
        • app/ (CakePHPアプリケーション)
          • vendors/
            • shells/
              • shell_task.sh (シェルスクリプト)
    • public_html/
      • example.com/ (CakePHPウェブルート)
        • index.php (CakePHPのディレクトリ構成を定義)

シェルスクリプト

/virtual/user/cakephp/apps/app/vendors/shells/shell_task.sh
#!/bin/sh

########################################
# 設定 (ここから環境に合わせて変更)
########################################
# CakePHP(コアとアプリケーション)を含むディレクトリへ移動
# `dirname $0` で、このシェルスクリプトがあるディレクトリへの相対パスが返る
#
# この例の場合は /virtual/user/cakephp へ移動する
cd `dirname $0`/../../../../ || exit 1

# CakePHPのアプリケーションディレクトリ(app)を含むディレクトリの絶対パス
# CakePHPの定数 ROOT に合わせる
# `pwd` でカレントディレクトリが返る
CAKE_ROOT="`pwd`/apps"

# CakePHPのアプリケーション(app)のディレクトリ名
# CakePHPの定数 APP_DIR に合わせる
CAKE_APP_DIR="app"

# CakePHPのcakeディレクトリを含むディレクトリの絶対パス
# CakePHPの定数 CAKE_CORE_INCLUDE_PATH に合わせる
CAKE_CORE_INCLUDE_PATH="`pwd`/1.3"

# Cakeコマンドのシェル名
CAKE_SHELL="shell"

# Cakeコマンドのタスク名
# シェルのみの場合は空文字にする
CAKE_TASK="task"
########################################
# 設定 (ここまで環境に合わせて変更)
########################################

########################################
# Cakeコマンドの実行 (ここから変更不要)
########################################

# 排他処理用のシンボリックリンクの名前
# `echo $CAKE_ROOT/$CAKE_APP_DIR | sed -e 's/\//_/g'` でパス中の / を _ に置換
# `basename $0` でこのシェルスクリプトのファイル名が返る
#
#   CAKE_ROOT="/virtual/user/cakephp/apps"
#   CAKE_APP_DIR="app"
#
# の場合で、このシェルスクリプトのファイル名が shell_task.sh の場合、シンボリックリンクは、
#
#   /tmp/_virtual_user_cakephp_apps_app_shell_task.sh
#
# となる
LOCK_NAME="/tmp/`echo $CAKE_ROOT/$CAKE_APP_DIR | sed -e 's/\//_/g'`_`basename $0`"

# シンボリックリンクを作成
# シンボリックリンクが既に存在している場合(=シェルスクリプトを実行中)は終了
ln -s /dummy $LOCK_NAME || exit 1

# シグナル受信時にシンボリックリンクを削除
# 1=HUP(再起動), 2=INT(割り込み), 3=QUIT(終了), 15=TERM(終了)
trap "rm $LOCK_NAME; exit 1" 1 2 3 15

# Cakeコマンドを実行
php $CAKE_CORE_INCLUDE_PATH/cake/console/cake.php $CAKE_SHELL $CAKE_TASK -app $CAKE_ROOT/$CAKE_APP_DIR

# シンボリックリンクを削除
rm $LOCK_NAME || exit 1

# 終了
exit 0

コメント (0)

この記事へのコメントはまだありません。

コメントフォーム

トラックバック (0)

この記事へのトラックバックはまだありません。

この記事のトラックバックURI
http://dxd8.com/archives/208/trackback/
この記事のURI
http://dxd8.com/archives/208/