1、Processguard使用场景。后台经常有这样的场景。某个脚本需要反复运行。这个时候最好有一个daemon来帮助我们不断的自动拉起这些脚本进程,让它自动的反复运行。Linux/Unix系统下,supervisor是python开发的一款优秀的进程管理工具。本文尝试使用php实现一个类似的进程管理工具。2、swoole的进程管理模块。php的swoole扩展有一个进程管理模块。看官方文档:swoole进程管理模块是指supervisor的实现。受保护的进程作为主管的子进程启动。supervisor监听子进程的信号,实现进程自动重启等功能。swoole的进程管理模块提供了进程间通信的功能,可以实现子进程的自动重启功能。3.第一个进程守护进程。要实现子程序的监护,需要做两件事:程序需要监听子程序的结束信号,以便重新启动新的子程序。子进程的运行环境需要独立于父进程。swoole进程管理模块提供了一个boolProcess->exec(string$execfile,array$args)方法将子进程转化为另一个系统调用程序,同时保证父进程和当前进程仍然是父子进程。然后使用数组Process::wait(bool$blocking=true)方法等待子进程的退出信号。以下是使用swoole启动子进程并回收子进程资源的示例代码:exec('/bin/sh',['-c',$command]);});$pid=$process->start();printf("启动子进程{$pid}\n");while($ret=Process::wait()){$pid=intval($ret["pid"]??0);printf("Thesub-process{$pid}ends\n");}代码分析:$command变量表示需要子进程脚本,通过exec()方法作为子进程运行,然后使用Process::wait()等待$command的子进程脚本结束,回收进程资源。那么只要在收到子进程的结束信号后启动同一个子进程脚本,就可以实现对子进程的保护。因此,第一个守护子进程的程序实现代码:exec('/bin/sh',['-c',$command]);});$pid=$process->start();printf("启动子进程{$pid}\n");}while(Process::wait());代码分析:这段代码只是将启动子进程的逻辑加入了一个死循环,使得子进程脚本可以不断重启。4.封装成一个类为了方便这段代码的复用,可以把这段代码封装成一个简单的类:command=$command;}publicfunctionrun(){do{$process=newProcess(function(Process$worker){$worker->exec('/bin/sh',['-c',$this->command]);});$pid=$process->start();}while(进程::等待());}}然后,这个Daemon类的使用方法如下:run();虽然这个简单的Daemon类可以重启并守护单个脚本,但是如果我们有很多脚本需要同时守护,这个Daemon类显然是不能满足需求的。下篇文章使用swoole实现进程守护(二)会尝试扩展这个Daemon类。
