エンジニア

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

投稿日:2014年9月16日 更新日:

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

前回のエントリー「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の自動起動スクリプトをご紹介しました。今回のケースのように起動スクリプトが同梱されていないパッケージがあるかと思いますが、これに手を加えることで対応できるようになるでしょう。

採用情報

ワンダープラネットでは、一緒に働く仲間を幅広い職種で募集しております。

-エンジニア
-

© WonderPlanet Inc.