サーバー担当の山内です。
前回のエントリー「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)に基いて記述します。
http://refspecs.linuxfoundation.org/LSB_3.1.0/LSB-Core-generic/LSB-Core-generic/initscrcomconv.html
#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の自動起動スクリプトをご紹介しました。今回のケースのように起動スクリプトが同梱されていないパッケージがあるかと思いますが、これに手を加えることで対応できるようになるでしょう。