发表时间:2015-05-27来源:网络
只要安装了php 命令行工具就行
运行示例:
php supervisor.php /usr/local/nginx/bin/nginx nobody (这后面还可以加上对应命令的参数,无参数留空就行) &
参数介绍:第一个为命令行的php可执行程序,第二个为本文下面的代码文件,第三个是需要启动的可以执行的程序路径,第四个是用什么角色启动它,后面的是预留参数,全部传递给这个可执行程序。
优点:
1、 需要守护的程序在 非daemon 状态下运行,出现错误退出时能立即重启
2、程序为daemon运行时,定时检测运行状态,1秒内重启
3、能够在特定的时间内设置重启的次数,次数超过配置数就不再重启,防止应用程序出现特别情况无法重启。
建议:
建议把程序调成非daemon状态下运行。
把以下代码复制另存为supervisor.php文件即可
[php]
<?php
//author email: tipboy@qq.com
$_retry_times=5;
$_retry_times_duration=60;//这个是多少时间内,重启了多少次,就不需要再重启了
$_times_arr=array();
$args=$_SERVER['argv'];
if(count($args)<3)
{
write_log("args num error!");
write_log("etc: php supervisor.php /usr/local/nginx/bin/nginx nobody xxx");
write_log("第一个参数就是本文件,第二个参数是要监控的可执行文件路径,第三个是使用哪个用户执行,接下来的参数就是执行该执行文件所用的参数");
exit();
}
//$args[0] 为本文件名
$path=$args[1];
$username=$args[2];
for($i=3;$i>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<time()-$_retry_times_duration)
{
//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;
}
}
?>
<?php
//author email: tipboy@qq.com
$_retry_times=5;
$_retry_times_duration=60;//这个是多少时间内,重启了多少次,就不需要再重启了
$_times_arr=array();
$args=$_SERVER['argv'];
if(count($args)<3)
{
write_log("args num error!");
write_log("etc: php supervisor.php /usr/local/nginx/bin/nginx nobody xxx");
write_log("第一个参数就是本文件,第二个参数是要监控的可执行文件路径,第三个是使用哪个用户执行,接下来的参数就是执行该执行文件所用的参数");
exit();
}
//$args[0] 为本文件名
$path=$args[1];
$username=$args[2];
for($i=3;$i>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<time()-$_retry_times_duration)
{
//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;
}
}
?>
上一篇:PHP数组的“自然”排序
下一篇:PHP连接MSSQL的问题
CI框架连接数据库配置操作以及多数据库操作
asp 简单读取数据表并列出来 ASP如何快速从数据库读取大量数据
C语言关键字及其解释介绍 C语言32个关键字详解
C语言中sizeof是什么意思 c语言里sizeof怎样用法详解
PHP中的魔术方法 :__construct, __destruct , __call, __callStatic,__get, __set, __isset, __unset , __sleep,
将视频设置为Android手机开机动画的教程
PHP中的(++i)前缀自增 和 (i++)后缀自增
最简单的asp登陆界面代码 asp登陆界面源代码详细介绍
常用dos命令及语法
PHP中include和require区别之我见
兴鼎健康平台下载v3.3.3 安卓官方版
42.12MB |生活服务
快付Pay下载v1.1.31 最新版
20.04MB |商务办公
花月鲜花app下载v2.2.1 安卓官方版
8.63MB |生活服务
一刻talksapp下载v9.5.8 安卓最新版
75.83MB |学习教育
滨海人才网招聘官方版下载v2.1.6 安卓最新版
66.78MB |生活服务
如祺出行企业版app下载v3.6.0 安卓最新版
65.87MB |生活服务
朗拓智慧外勤软件下载v9.4.0 安卓官方版
36.01MB |商务办公
格之格打印app官方正版(G&G Print)下载v1.1.25 安卓版
165.26MB |系统工具
2014-09-05
2022-03-20
2022-03-21
2022-03-24
2014-09-05
2014-09-05
2015-07-05
2014-09-05
2014-09-05
2022-03-21
绝望3黑暗地心中文版(hopeless3)下载v1.3.9 安卓汉化版
其它手游绝望3黑暗地球中文版(hopeless3)下载v1.3.9 安卓版
其它手游绳索英雄骷髅王手游下载v1.1.5 安卓版
其它手游战场模拟官方版下载v1.49.3 安卓最新版
其它手游僵尸战争战斗幸存者游戏下载v6.7 安卓版
其它手游糖果工厂宝宝巴士最新版下载v9.99.00.10 安卓版
其它手游糖果工厂游戏免费版下载v9.99.00.10 安卓手机版
其它手游制作谷游戏下载v1.3.15 安卓版
其它手游疯狂大酒店中文版下载v4.17.5.19 安卓最新版
其它手游