只要安装了php 命令行工具就行
运行示例:
php supervisor.php /usr/local/nginx/bin/nginx nobody (这后面还可以加上对应命令的参数,无参数留空就行) &
参数介绍:第一个为命令行的php可执行程序,第二个为本文下面的代码文件,第三个是需要启动的可以执行的程序路径,第四个是用什么角色启动它,后面的是预留参数,全部传递给这个可执行程序。
优点:
1、 需要守护的程序在 非daemon 状态下运行,出现错误退出时能立即重启
2、程序为daemon运行时,定时检测运行状态,1秒内重启
3、能够在特定的时间内设置重启的次数,次数超过配置数就不再重启,防止应用程序出现特别情况无法重启。
建议:
建议把程序调成非daemon状态下运行。
把以下代码复制另存为supervisor.php文件即可
[php]
//author email: tipboy@qq.com
$_retry_times=5;
$_retry_times_duration=60;//这个是多少时间内,重启了多少次,就不需要再重启了
$_times_arr=array();
$args=$_SERVER['argv'];
if(count($args)
{
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
{
//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;
}
}
?>
//author email: tipboy@qq.com
$_retry_times=5;
$_retry_times_duration=60;//这个是多少时间内,重启了多少次,就不需要再重启了
$_times_arr=array();
$args=$_SERVER['argv'];
if(count($args)
{
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
{
//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;
}
}
?>

熱AI工具

Undresser.AI Undress
人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover
用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool
免費脫衣圖片

Clothoff.io
AI脫衣器

AI Hentai Generator
免費產生 AI 無盡。

熱門文章

熱工具

MinGW - Minimalist GNU for Windows
這個專案正在遷移到osdn.net/projects/mingw的過程中,你可以繼續在那裡關注我們。 MinGW:GNU編譯器集合(GCC)的本機Windows移植版本,可自由分發的導入函式庫和用於建置本機Windows應用程式的頭檔;包括對MSVC執行時間的擴展,以支援C99功能。 MinGW的所有軟體都可以在64位元Windows平台上運作。

WebStorm Mac版
好用的JavaScript開發工具

SecLists
SecLists是最終安全測試人員的伙伴。它是一個包含各種類型清單的集合,這些清單在安全評估過程中經常使用,而且都在一個地方。 SecLists透過方便地提供安全測試人員可能需要的所有列表,幫助提高安全測試的效率和生產力。清單類型包括使用者名稱、密碼、URL、模糊測試有效載荷、敏感資料模式、Web shell等等。測試人員只需將此儲存庫拉到新的測試機上,他就可以存取所需的每種類型的清單。

Dreamweaver Mac版
視覺化網頁開發工具

Safe Exam Browser
Safe Exam Browser是一個安全的瀏覽器環境,安全地進行線上考試。該軟體將任何電腦變成一個安全的工作站。它控制對任何實用工具的訪問,並防止學生使用未經授權的資源。