您好,欢迎访问一九零五行业门户网

用php写的进程守护,进程管理,进程出错自动启动功能,适合服务器管理员使用_PHP教程

只要安装了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 (这后面还可以加上对应命令的参数,无参数留空就行)...
其它类似信息

推荐信息