読者です 読者をやめる 読者になる 読者になる

WonderPlanet DEVELOPER BLOG

ワンダープラネットの開発者ブログです。モバイルゲーム開発情報を発信。

HHVMを自動で起動・停止させる

サーバー担当の山内です。

前回のエントリー「HHVM + nginxでMessagePackを使う」で構築したHHVMを、システム起動時に起動させるスクリプトを作成しました。

1. 目的

  • システム起動時にHHVMデーモンを起動させる
  • service hhvm start|stop|restartを実行できるようにする

2. 方法

Ubuntu 14.04 LTS上で動作させることを前提とします。
起動スクリプトを/etc/init.d/配下に置き、update-rc.dコマンドでシンボリックリンクを作成することで実現します。

3. スクリプトの作成

/etc/init.d/配下に起動スクリプトを作成します。

vim /etc/init.d/hhvm  

#! /bin/sh  
### BEGIN INIT INFO  
# Provides:          Upstart HHVM Daemon  
# Required-Start:    $remote_fs $syslog  
# Required-Stop:     $remote_fs $syslog  
# Default-Start:     2 3 4 5  
# Default-Stop:      0 1 6  
# Short-Description: Start|Stop HHVM daemon  
# Description:       HHVM is an open-source virtual machine  
#                    designed for executing programs written in Hack and PHP.  
### END INIT INFO  
  
#1  
HHVM=/usr/local/bin/hhvm  
  
test -x $HHVM || exit 0  
  
#2  
HHVMDIR=/etc/hhvm/  
CONFIG=config.hdf  
PHPINI=php.ini  
PORT=9000  
PID=/var/run/hhvm/pid  
RED="\033[01;31"  
COLORLESS="\033["  
ESCEND=m  
  
case "$1" in  
  start)  
        #3  
        if [ ! -d /var/run/hhvm ]; then  
          mkdir /var/run/hhvm  
        fi  
  
        $HHVM --config $HHVMDIR$CONFIG --config $HHVMDIR$PHPINI --mode daemon -vServer.Type=fastcgi -vServer.Port=$PORT -vPidFile=$PID  
        echo "${RED}${ESCEND} * HHVM is running..."  
        echo "${COLORLESS}${ESCEND}"  
        ;;  
  
  stop)  
        #4  
        start-stop-daemon --stop --quiet --oknodo --pidfile $PID  
        echo "${RED}${ESCEND} * HHVM is stopped."  
        echo "${COLORLESS}${ESCEND}"  
        ;;  
  
  reload|force-reload|restart|try-restart)  
        $0 stop  
        $0 start  
        ;;  
  
  status)  
        #5  
        ps -ef | grep $HHVM | grep -v grep | grep -v status  
        if [ "$?" -eq 0 ]  
        then  
          echo "${RED}${ESCEND} * HHVM is running..."  
          echo "${COLORLESS}${ESCEND}"  
        else  
          echo "${RED}${ESCEND} * HHVM is stopped."  
          echo "${COLORLESS}${ESCEND}"  
        fi  
        ;;  
  
  *)  
        echo "Usage: service hhvm {start|stop|restart|status}"  
        exit 1  
esac  
  
exit 0  

あらかじめconfig.hdfとphp.iniを/etc/hhvm/配下に設置しておきます。

ヘッダ部の

### BEGIN INIT INFO  
### END INIT INFO  

は、Init Script LSB (Linux Standard Base)の仕様(*1)に基いて記述します。

#1

HHVMのバイナリが存在するかチェックし、存在しなければ終了します。

#2

HHVMの設定ファイルパスやポートを格納しています。REDは文字の強調+赤、COLORLESSは文字色をデフォルトにするエスケープシーケンスです。ESCENDを末尾に付けて使っています。

#3

第1引数にstartが渡されたときにこの分岐処理が走ります。もしPidFileを格納するディレクトリが無ければ作成し、HHVMを実行させます。PidFileとはOSが管理するプロセスIDを記録しておくファイルのことです。

#4

第1引数にstopが渡されると、start-stop-daemonによって−−pidfileオプションで指定したPidFileに記録されているプロセスIDをkillします。

#5

第1引数にstatusが渡されると、HHVMの実行状態を確認します。if条件式内の$?は直前に実行したコマンドの終了ステータスが格納されている特殊な変数です。終了ステータスが1だった場合、つまり下記コマンドの結果、何も返ってこなかった場合はHHVMが停止していると判断されます。

ps -ef | grep /usr/local/bin/hhvm | grep -v grep | grep -v status  

4. 起動設定

update-rc.dコマンドを使ってシンボリックリンクを作成します。

# update-rc.d hhvm defaults  
 Adding system startup for /etc/init.d/hhvm ...  
   /etc/rc0.d/K20hhvm -> ../init.d/hhvm  
   /etc/rc1.d/K20hhvm -> ../init.d/hhvm  
   /etc/rc6.d/K20hhvm -> ../init.d/hhvm  
   /etc/rc2.d/S20hhvm -> ../init.d/hhvm  
   /etc/rc3.d/S20hhvm -> ../init.d/hhvm  
   /etc/rc4.d/S20hhvm -> ../init.d/hhvm  
   /etc/rc5.d/S20hhvm -> ../init.d/hhvm  

5. おわりに

ソースからコンパイルしてインストールしたHHVMの自動起動スクリプトをご紹介しました。今回のケースのように起動スクリプトが同梱されていないパッケージがあるかと思いますが、これに手を加えることで対応できるようになるでしょう。