PHPで作成したプログラムをデーモン化しサービス起動させる場合には、デーモン化対応した「PHPプログラム」とそれを起動する「起動スクリプト」の2種類を用意する必要がある。
PHPプログラム
PHPプログラムでは、まず自プロセスをfork/execし端末から切り離し、実行中のプログラムをPIDファイルに書き込む。そのあと自分のプロセスをセッションリーダに指定する処理を行う。
<?php // pid fileの生成 $pidfile = "/var/run/hoged/hoged.pid"; // 全てのエラー出力をOFF error_reporting(0); // 子プロセスの生成 $pid = pcntl_fork(); if($pid < 0){ // 失敗時 exit(); }else if($pid){ // 親プロセスの終了 exit(); }else{ // pidファイルを生成 $pid = getmypid(); $fp = fopen($pidfile, "w"); @fwrite( $fp, $pid, strlen($pid) ); fclose($fp); // 現在のプロセスをセッションリーダにする $sid = posix_setsid(); if($sid<0){ // 失敗時 exit(); } // ループ処理 while(TRUE){ ////////////////////////// // 定期処理 // ///////////////////////// } } ?>
起動スクリプト
起動スクリプトは、/etc/rc.d/init.dに設置される各デーモンの起動や終了を行うスクリプトである。/etc/init.d/skeletonもしくは/usr/share/doc/initscripts-*/sysvinitfilesにサンプルが存在する。スクリプト内chkconfigの欄は、RunLevel, 起動時のPriority, 終了時のPriorityの順に記述する。PIDを置くディレクトリは事前にmkdirしておく必要がある。
#!/bin/bash # # hoged Startup script for the Hoge System # # chkconfig: 345 99 01 # descroption: The Hoge System. # processname: hoged # # Source function library. . /etc/init.d/functions # Path to the script hoged=/home/hoge/hoged.php prog=hoged pidfile=${PIDFILE-/var/run/hoged/hoged.pid} lockfile=${LOCKFILE-/var/lock/subsys/hoged} RETVAL=0 start() { if [ -f $lockfile ]; then echo "$prog is Started" exit 1 fi echo -n "Starting $prog: " daemon --pidfile=${pidfile} --user hoge php $hoged RETVAL=$? echo [ $RETVAL = 0 ] && touch ${lockfile} return $RETVAL } stop() { echo -n "Shutting down $prog: " killproc -p ${pidfile} $hoged RETVAL=$? echo [ $RETVAL = 0 ] && rm -f ${lockfile} ${pidfile} } case "$1" in start) start ;; stop) stop ;; status) status -p ${pidfile} $hoged RETVAL=$? ;; restart) stop start ;; *) echo "Usage: $prog {start|stop|status}" exit 1 ;; esac exit $RETVAL