2014-09-05
只要安装了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;
}
}
?>
1
CI框架连接数据库配置操作以及多数据库操作
09-05
2
asp 简单读取数据表并列出来 ASP如何快速从数据库读取大量数据
05-17
3
C语言关键字及其解释介绍 C语言32个关键字详解
04-05
4
C语言中sizeof是什么意思 c语言里sizeof怎样用法详解
04-26
5
PHP中的魔术方法 :__construct, __destruct , __call, __callStatic,__get, __set, __isset, __unset , __sleep,
09-05
6
将视频设置为Android手机开机动画的教程
12-11
7
PHP中的(++i)前缀自增 和 (i++)后缀自增
09-05
8
最简单的asp登陆界面代码 asp登陆界面源代码详细介绍
04-12
常用dos命令及语法
2014-09-27
PHP中include和require区别之我见
2014-09-05
如何安装PHPstorm并配置方法教程 phpstorm安装后要进行哪些配置
2017-05-03
php递归返回值的问题
2014-09-05
单片机编程好学吗?单片机初学者怎样看懂代码
2022-03-21
PHP 教程之如何使用BLOB存取图片信息实例
2014-09-05
学ug编程如何快速入门?
2022-03-17
PHP数组函数array
2014-09-05
学习使用C语言/C++编程的7个步骤!超赞~
2022-03-20
零基础的初学者怎样学习java,或者应该先学什么?
2022-03-21
热血巷战手机版下载v1.1.1.107 安卓版
其它手游 65MB
下载
街头斗士功夫进攻5最新版下载v1.1.1.107 安卓版
其它手游 65MB
下载
点击忍者大师游戏(tap ninja)下载v7.1.9 安卓版
其它手游 77.74MB
下载
tap ninja游戏下载v7.1.9 安卓版
其它手游 77.74MB
下载
德雷姆代尔手机版下载v2.7.0 安卓正式版
其它手游 187.16MB
下载
火柴人龙影战士中文版下载v2.0.0 安卓版
其它手游 101.44MB
下载
火柴人战士暗影龙珠格斗游戏下载v2.0.0 安卓版
其它手游 101.44MB
下载
火柴人勇士超级龙影搏斗最新版下载v2.0.0 安卓版
其它手游 101.44MB
下载安洁拉世界奇幻之旅游戏下载v2.9 安卓版
下载
坦克沙盒游戏手机版(坦克物理模拟)下载v9.0 安卓版
下载
太空人抽卡对决手机版下载v1.6 安卓版
下载
棕熊露营旅行游戏下载v1.1.0 安卓版
下载
回家的猫游戏下载v2.5.18 安卓版
下载
蜗牛鲍勃3游戏(snail bob 3)下载v1.0.34 安卓版
下载
snail bob3最新版下载v1.0.34 安卓版
下载
西梅小说手机版v1.0
下载