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

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

Jun 13, 2016 am 10:56 AM
php 使用 出错 功能 启动 命令行 installer 服务器 utiliser 管理 管理员 自动 进程 Approprié

只要安装了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;
 }
}
?>


 

Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn

Outils d'IA chauds

Undresser.AI Undress

Undresser.AI Undress

Application basée sur l'IA pour créer des photos de nu réalistes

AI Clothes Remover

AI Clothes Remover

Outil d'IA en ligne pour supprimer les vêtements des photos.

Undress AI Tool

Undress AI Tool

Images de déshabillage gratuites

Clothoff.io

Clothoff.io

Dissolvant de vêtements AI

AI Hentai Generator

AI Hentai Generator

Générez AI Hentai gratuitement.

Article chaud

R.E.P.O. Crystals d'énergie expliqués et ce qu'ils font (cristal jaune)
3 Il y a quelques semaines By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. Meilleurs paramètres graphiques
3 Il y a quelques semaines By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. Comment réparer l'audio si vous n'entendez personne
3 Il y a quelques semaines By 尊渡假赌尊渡假赌尊渡假赌
Où trouver la courte de la grue à atomide atomique
1 Il y a quelques semaines By DDD

Outils chauds

Bloc-notes++7.3.1

Bloc-notes++7.3.1

Éditeur de code facile à utiliser et gratuit

SublimeText3 version chinoise

SublimeText3 version chinoise

Version chinoise, très simple à utiliser

Envoyer Studio 13.0.1

Envoyer Studio 13.0.1

Puissant environnement de développement intégré PHP

Dreamweaver CS6

Dreamweaver CS6

Outils de développement Web visuel

SublimeText3 version Mac

SublimeText3 version Mac

Logiciel d'édition de code au niveau de Dieu (SublimeText3)

Guide d'installation et de mise à niveau de PHP 8.4 pour Ubuntu et Debian Guide d'installation et de mise à niveau de PHP 8.4 pour Ubuntu et Debian Dec 24, 2024 pm 04:42 PM

PHP 8.4 apporte plusieurs nouvelles fonctionnalités, améliorations de sécurité et de performances avec une bonne quantité de dépréciations et de suppressions de fonctionnalités. Ce guide explique comment installer PHP 8.4 ou mettre à niveau vers PHP 8.4 sur Ubuntu, Debian ou leurs dérivés. Bien qu'il soit possible de compiler PHP à partir des sources, son installation à partir d'un référentiel APT comme expliqué ci-dessous est souvent plus rapide et plus sécurisée car ces référentiels fourniront les dernières corrections de bogues et mises à jour de sécurité à l'avenir.

Date et heure de CakePHP Date et heure de CakePHP Sep 10, 2024 pm 05:27 PM

Pour travailler avec la date et l'heure dans cakephp4, nous allons utiliser la classe FrozenTime disponible.

CakePHP travaillant avec la base de données CakePHP travaillant avec la base de données Sep 10, 2024 pm 05:25 PM

Travailler avec la base de données dans CakePHP est très simple. Nous comprendrons les opérations CRUD (Créer, Lire, Mettre à jour, Supprimer) dans ce chapitre.

Téléchargement de fichiers CakePHP Téléchargement de fichiers CakePHP Sep 10, 2024 pm 05:27 PM

Pour travailler sur le téléchargement de fichiers, nous allons utiliser l'assistant de formulaire. Voici un exemple de téléchargement de fichiers.

Discuter de CakePHP Discuter de CakePHP Sep 10, 2024 pm 05:28 PM

CakePHP est un framework open source pour PHP. Il vise à faciliter grandement le développement, le déploiement et la maintenance d'applications. CakePHP est basé sur une architecture de type MVC à la fois puissante et facile à appréhender. Modèles, vues et contrôleurs gu

CakePHP créant des validateurs CakePHP créant des validateurs Sep 10, 2024 pm 05:26 PM

Le validateur peut être créé en ajoutant les deux lignes suivantes dans le contrôleur.

Journalisation CakePHP Journalisation CakePHP Sep 10, 2024 pm 05:26 PM

Se connecter à CakePHP est une tâche très simple. Il vous suffit d'utiliser une seule fonction. Vous pouvez enregistrer les erreurs, les exceptions, les activités des utilisateurs, les actions entreprises par les utilisateurs, pour tout processus en arrière-plan comme cronjob. La journalisation des données dans CakePHP est facile. La fonction log() est fournie

Comment configurer Visual Studio Code (VS Code) pour le développement PHP Comment configurer Visual Studio Code (VS Code) pour le développement PHP Dec 20, 2024 am 11:31 AM

Visual Studio Code, également connu sous le nom de VS Code, est un éditeur de code source gratuit – ou environnement de développement intégré (IDE) – disponible pour tous les principaux systèmes d'exploitation. Avec une large collection d'extensions pour de nombreux langages de programmation, VS Code peut être c

See all articles