只要安装了php 命令行工具就行
运行示例:
php supervisor.php /usr/local/nginx/bin/nginx nobody (这后面还可以加上对应命令的参数,无参数留空就行) &
参数介绍:第一个为命令行的php可执行程序,第二个为本文下面的代码文件,第三个是需要启动的可以执行的程序路径,第四个是用什么角色启动它,后面的是预留参数,全部传递给这个可执行程序。
优点:
1、 需要守护的程序在 非daemon 状态下运行,出现错误退出时能立即重启
2、程序为daemon运行时,定时检测运行状态,1秒内重启
3、能够在特定的时间内设置重启的次数,次数超过配置数就不再重启,防止应用程序出现特别情况无法重启。
建议:
建议把程序调成非daemon状态下运行。
把以下代码复制另存为supervisor.php文件即可
[php]
0;$i--)
array_shift($args);
while(1){
$pid=pcntl_fork();
if($pid==0)
{
//write_log(child .getmypid(). run);
pcntl_exec($path,$args,$_server);
write_log(execute file failed);
exit(0);
}
else if($pid>0)
{
//write_log( main pid:.getmypid()., child_pid:.$pid);
$endpid=pcntl_waitpid($pid,$status,2);
//write_log(status:.$status);
if($status==0)
{
//说明可能是daemon程序,后台运行
if(file_exists(/proc/.($pid+1)./stat))
{
//说明进程存在,需要定时判断
write_log(program start success);
for (;;)
{
if(file_exists(/proc/.($pid+1)./stat))
{
//write_log(program is alive);
usleep(1000000);
}
else
{
write_log(program die);
break;
}
}
}
else
{
//说明进程不存在,并且不是非daemon状态。
write_log(program start failed);
exit(0);
}
}
else if($status>0)
{
//说明是非daemon 程序,退出来了,需要重新启动
write_log(program die);
//continue;
}
else
{
exit(0);
}
if(chk_need_start($_times_arr,$_retry_times_duration,$_retry_times))
{
continue;
}
else
{
break;
}
}
};
function write_log($msg)
{
print(date('y-m-d h:i:s').' '.$msg.\n);
}
function chk_need_start(&$_times_arr,$_retry_times_duration,$_retry_times)
{
foreach($_times_arr as $k=>$v)
{
//write_log(duration:.$_retry_times_duration);
if($k {
//write_log(do unset);
unset($_times_arr[$k]);
}
}
//write_log(buffer count:.count($_times_arr));
if(count($_times_arr)>=$_retry_times)
{
return false;
}
else
{
$_times_arr[time()]=1;
return true;
}
}
?>
0;$i--)
array_shift($args);
while(1){
$pid=pcntl_fork();
if($pid==0)
{
//write_log(child .getmypid(). run);
pcntl_exec($path,$args,$_server);
write_log(execute file failed);
exit(0);
}
else if($pid>0)
{
//write_log( main pid:.getmypid()., child_pid:.$pid);
$endpid=pcntl_waitpid($pid,$status,2);
//write_log(status:.$status);
if($status==0)
{
//说明可能是daemon程序,后台运行
if(file_exists(/proc/.($pid+1)./stat))
{
//说明进程存在,需要定时判断
write_log(program start success);
for (;;)
{
if(file_exists(/proc/.($pid+1)./stat))
{
//write_log(program is alive);
usleep(1000000);
}
else
{
write_log(program die);
break;
}
}
}
else
{
//说明进程不存在,并且不是非daemon状态。
write_log(program start failed);
exit(0);
}
}
else if($status>0)
{
//说明是非daemon 程序,退出来了,需要重新启动
write_log(program die);
//continue;
}
else
{
exit(0);
}
if(chk_need_start($_times_arr,$_retry_times_duration,$_retry_times))
{
continue;
}
else
{
break;
}
}
};
function write_log($msg)
{
print(date('y-m-d h:i:s').' '.$msg.\n);
}
function chk_need_start(&$_times_arr,$_retry_times_duration,$_retry_times)
{
foreach($_times_arr as $k=>$v)
{
//write_log(duration:.$_retry_times_duration);
if($k {
//write_log(do unset);
unset($_times_arr[$k]);
}
}
//write_log(buffer count:.count($_times_arr));
if(count($_times_arr)>=$_retry_times)
{
return false;
}
else
{
$_times_arr[time()]=1;
return true;
}
}
?>
http://www.bkjia.com/phpjc/477518.htmlwww.bkjia.comtruehttp://www.bkjia.com/phpjc/477518.htmltecharticle只要安装了php 命令行工具就行 运行示例: php supervisor.php /usr/local/nginx/bin/nginx nobody (这后面还可以加上对应命令的参数,无参数留空就行)...