本发明涉及Linux软件技术领域,尤其涉及一种Linux系统进程守护方法。
背景技术:
进程是运行中的程序,包括代码、数据和分配给进程的资源。一个运行着的程序可能有多个进程,比如,WWW服务器是apache服务器,当管理员启动服务后,可能会有多个用户来访问,也就是说多个用户同时请求httpd服务,apache服务器将会创建有多个httpd进程来对其进行服务。
进程有可执行状态(R)、可中断的睡眠状态(S)、不可中断的睡眠状态(D)、暂停状态或跟踪状态(T)、僵尸状态(Z)、退出状态(X)几种状态。
一个进程调用fork()函数后,系统先给新的进程分配资源,例如存储数据和代码的空间。在fork()函数执行完毕后,则出现两个进程,一个是子进程,一个是父进程。当父进程创建子进程之后,对子进程进行状态监控。当子进程出现异常时,进行资源回收并创建新的健康进程替代。系统运行整个过程需要保证子进程的正常运行。
多进程并发运行是Linux系统的一大特点,每个功能模块都是以进程的方式运行,当运行过程某个模块因为异常导致退出时,系统其它进程仍然可以正常工作,并不会因为此而重启系统,给用户带了良好的体验。
目前Linux系统的进程守护做法是父进程时刻监控子进程的运行状态,当某一时刻子进程异常变成僵尸进程后,父进程调用wait()函数或者waitpid()函数进行回收,然后调用fork()函数创建一个新进程替换。这种方法存在如下问题:
1、当异常进程被重启的时候,程序需要进行再次初始化,模块运行的数据可能会被刷新,造成跟重启前的状态不一致。
2、当进程内部有异常,但是没有挂死,父进程是无法识别的,这时候并不能使异常的进程恢复。
3、系统异常挂死被重启,基本上没有痕迹,不便于分析进程挂死的原因,解决问题的效率低下。
技术实现要素:
本发明提供一种Linux系统进程守护方法,旨在解决现有技术中的缺陷,实现进程的安全守护。
为达到上述目的,本发明所采取的技术方案为:
本发明提供一种Linux系统进程守护方法,包括:
S1、进程守护模块启动;
S2、所述进程守护模块创建各应用子进程;
S3、所述进程守护模块监控所述各应用子进程;
S4、所述进程守护模块判断所述应用子进程的运行状态是否为僵尸进程,是则进入S5,否则进入S6;
S5、所述进程守护模块调用进程回收函数回收所述僵尸进程,并重启新进程以恢复所述应用子进程;
S6、所述进程守护模块以第二预设周期向所述应用子进程发送心跳请求广播;
S7、所述进程守护模块判断在连续预设次数内是否接收到所述应用子进程的回应,是则返回S3,否则结束并重启所述应用子进程。
进一步,在所述S3之后还包括:
S31a、所述进程守护模块监控服务进程;
S32、所述服务进程以第三预设周期发送服务进程异常信息给进程所述守护模块;
S33、所述进程守护模块存储所述服务进程异常信息。
具体地,所述S33包括:所述进程守护模块通过存储管理进程将所述服务进程异常信息写入文件系统进行存储。
进一步地,在所述S33之后还包括:
S34、所述应用进程及服务进程在正常运行时以第四预设周期记忆进程恢复参数。
进一步地,在所述S3之后还包括:
S31b、所述进程守护模块监控诊断进程,所述诊断进程收集各应用进程的错误诊断码,存储在文件系统中。
进一步地,在所述S7之后还包括:
S8、所述进程守护模块在重启新进程时给新进程传入所述进程恢复参数。
进一步地,在所述S8之后还包括:
S9、所述进程守护模块以第五预设周期调用看门狗模块进行喂狗,若所述看门狗模块在预设计数溢出时间内没收到喂狗调用,则重启系统,或者:
所述进程守护模块包括第一进程守护模块、第二进程守护模块,当所述第二进程守护模块检测到第一进程守护模块异常后,替代所述第一进程守护模块进行进程监控,并重启所述第一进程守护模块。
本发明的有益效果在于:本发明通过进程守护模块创建并监控所有子进程,当子进程出现僵尸进程或异常状态可及时进行重启,并通过保存应用进程及服务进程的恢复参数,当进程重启后传入进程恢复参数,恢复上一次运行的状态。
附图说明
图1是本发明的Linux系统进程守护方法的系统示意图;
图2是本发明的Linux系统进程守护方法的流程示意图。
具体实施方式
下面结合附图具体阐明本发明的实施方式,附图仅供参考和说明使用,不构成对本发明专利保护范围的限制。
如图1所示,是本发明的系统示意图,涉及系统四大部分:应用层、中间件层、内核层和文件系统。实现本发明所述进程守护方法的进程守护模块位于中间件层。
实施例1
如图2所示,是本发明的Linux系统进程守护方法的流程示意图,包括如下步骤:
步骤1、进程守护模块启动。
步骤2、所述进程守护模块创建各应用子进程。
与现有技术不同的是,在本实施例中,所述进程守护模块为所有应用进程的父进程,可以获取各子进程的状态,对各子进程进行正常运行守护,回收并重启异常的子进程。
各应用子进程与进程守护模块通过进程间通信的方式(如Dbus)进行信息交互。
步骤3、所述进程守护模块监控所述各应用子进程。
在本实施例中,所述进程守护模块以第一预设周期查询所述各应用子进程的运行状态进行监控。
在本实施例中,所述第一预设周期为5秒。
步骤4、所述进程守护模块判断所述应用子进程的运行状态是否为僵尸进程,是则进入步骤5,否则进入步骤6。
当进程守护模块创建一个子进程后,如果所述子进程退出,但该子进程的进程描述符仍然保存在系统中,则该进程称之为僵尸进程。由于僵尸进程会占用进程号,但系统所能使用的进程号是有限的,因此可能会导致没有可用的进程号而导致进程守护模块不能产生新的进程。
步骤5、所述进程守护模块调用进程回收函数回收所述僵尸进程,并重启新进程以恢复所述应用子进程。
所述进程回收函数为wait()函数或waitpid()函数。
步骤6、所述进程守护模块以第二预设周期向所述应用子进程发送心跳请求广播。
在本实施例中,所述第二预设周期为2秒。
步骤7、所述进程守护模块判断在连续预设次数内是否接收到所述应用子进程的回应,是则返回步骤3,否则结束并重启所述应用子进程。
在本实施例中,所述预设次数为5次。
实施例2
与实施例1不同的是,在步骤3之后还包括:
步骤31a、所述进程守护模块监控服务进程。
所述服务进程与进程守护模块通过进程间通信的方式(如Dbus)进行信息交互。
步骤32、所述服务进程以第三预设周期发送服务进程异常信息给进程所述守护模块。
在本实施例中,所述第三预设周期为5秒。
步骤33、所述进程守护模块存储所述服务进程异常信息。
在本实施例中,所述步骤33包括:所述进程守护模块通过存储管理进程将所述服务进程异常信息写入文件系统进行存储。
在具体实施中,存储管理进程提供数据读写的接口,通过创建数据库和文件的方式保存数据。
实施例3
与实施例2不同的是,在步骤33之后还包括:
步骤34、所述应用进程及服务进程在正常运行时以第四预设周期记忆进程恢复参数。
在本实施例中,所述第四预设周期为5秒。
实施例4
与实施例1不同的是,在步骤3之后还包括:
步骤31b、所述进程守护模块监控诊断进程,所述诊断进程收集各应用进程的错误诊断码,存储在文件系统中。
所述所述进程守护模块通过监控所述诊断进程,可以在需要时提取所述错误诊断码进行显示,以便查找应用进程产生异常的原因。
实施例5
与实施例1不同的是,在步骤7之后还包括:
步骤8、所述进程守护模块在重启新进程时给新进程传入所述进程恢复参数。
与现有技术中调用fork()函数创建新进程时传入相同参数不同的是,所述进程守护模块重启新进程时给新进程传入不同的启动参数,表明本次进程启动的方式是进程异常后重启的。所述新进程根据启动参数去运行不同的初始化分支,以便恢复上一次运行的状态。
实施例6
与实施例5不同的是,在步骤8之后还包括:
步骤9、所述进程守护模块以第五预设周期调用看门狗模块进行喂狗,若所述看门狗模块在预设计数溢出时间内没收到喂狗调用,则重启系统。
在本实施例中,所述第五预设周期为2秒,所述预设计数溢出时间为10秒。
实施例7
与实施例6不同的是,所述步骤9为:
步骤9、所述进程守护模块包括第一进程守护模块、第二进程守护模块,当所述第二进程守护模块检测到第一进程守护模块异常后,替代所述第一进程守护模块进行进程监控,并重启所述第一进程守护模块。
以上所揭露的仅为本发明的较佳实施例,不能以此来限定本发明的权利保护范围,因此依本发明申请专利范围所作的等同变化,仍属本发明所涵盖的范围。