1. 前言-什么!进程又挂了?
相信大家在linux上开发或运维的时候,肯定遇到过类似的状况。我在linux上的进程运行的好好的,怎么会突然挂掉了?而造成这种状况的原因复杂多样,有可能和网络环境有关,有可能和服务器硬件/内存资源有关,又有可能和代码漏洞有关。我们暂且把这类问题的排查放到后面,那么现在考虑的就是怎么样防止我们的进程突然挂掉?这时候,我们的工具daemontools就派上用场了。
daemontools,又称进程守护者,他能监测我们进程的状态,当发现进程突然挂机后,能自动拉起挂机的进程,从而守护我们的进程。
2. daemontools安装和使用
2.1 daemontools安装
Tips>>以下安装运行环境均基于Centos7系统。为了管理统一方便,我的软件安装目录均在/learn下,你们可以自定义软件安装目录。
(1)创建文件夹并赋权限
[root@vm1 learn]# mkdir -p daemontools
[root@vm1 learn]# chmod 1755 daemontools/
[root@vm1 learn]# cd daemontools/
(2)安装包上传解压
下载daemontools-0.76.tar.gz,将压缩包daemontools-0.76.tar.gz上传到daemontools文件夹下,然后进行解压。
[root@vm1 daemontools]# gunzip daemontools-0.76.tar.gz
[root@vm1 daemontools]# tar -xvf daemontools-0.76.tar
[root@vm1 daemontools]# cd admin/daemontools-0.76/
(3)文件编译
[root@vm1 daemontools-0.76]# package/install
Tips>>如编译过程中遇报错,如图:
解决方案:vi compile/error.h 将
extern int errno;替换为 #include <errno.h>;重新编译即可,如图:
install脚本会在根目录/下创建两个目录:/service和/command目录。其中/service目录用来存放被daemontools管理的进程,/command目录下存放的是daemontools的一些常用命令。
2.2 daemontools使用
(1)启动daemontools服务
[root@vm1 /]# sudo /command/svscanboot &
Tips>>防止服务器特殊原因,将我们的daemontools守护进程意外终止,推荐将daemontools设置为系统服务,以系统服务的方式启动,具体实现方法见3.3。
启动后,使用ps命令查看进程,可以发现svscan作为svscanboot的子进程在运行,而且svscan监听的目录是/service目录。如图:
(2)配置守护进程
以配置tomcat守护进程为例,具体实现方式如下:
方式一:在/service目录下执行操作
[root@vm1 service]# mkdir tomcat
[root@vm1 service]# cd tomcat/
[root@vm1 service]# vim run
[root@vm1 service]# chmod +x run
注意:一定要赋予run文件执行权限! run文件内容如下:
#!/bin/sh
TOMCAT_HOME=/apps/apache-tomcat-8.5.51
exec ${TOMCAT_HOME}/bin/catalina.sh run
注意:使用daemontools管理的进程不能以daemon方式运行!
①服务的启动命令,不能是nohup启动的,因为nohup执行的太快了,最后导致nohup正常结束后,supervise认为nohup进程挂掉了,故会不断地去运行run文件。
②必须在run脚本的开头写上 #!/bin/sh ,否则报错:supervise: fatal: unable to start xx/run: exec format error
所以,在shell脚本中不能直接使用tomcat中bin/startup.sh进行启动,因为该启动方式为以daemon方式执行的。
注意:在/service目录下只能创建一级目录,然后在一级目录下创建run文件。如果涉及多级目录,则需要使用软链接方式。
注意:在/service目录下创建完对应服务的run脚本(一定要有执行权限)后,daemontools会自动执行run脚本,将该服务启动。
方式二:通过软链接操作
[root@vm1 /]# mkdir -p myservices
[root@vm1 /]# cd myservices/
[root@vm1 myservices]# mkdir -p tomcat/tomcat1
[root@vm1 tomcat1]# vim run
[root@vm1 tomcat1]# chmod +x run
run文件内容同方式一,然后添加软链接到/service目录:
[root@vm1 /]# ln -s /myservices/tomcat/tomcat1/ /service/
添加软链接后,/service目录如图所示:
(3)查看与验证
通过ps命令查看tomcat进程,如图:
使用kill命令手动杀死tomcat进程后,一段时间tomcat进程被自动拉起,查看其pid已变。
使用svstat命令查看服务状态,可以看到pid号以及启动运行时间。
Tips>>大家可以每隔一段时间执行svstat命令,查看服务的pid号是否频繁变化,从而判断该服务run脚本是否正常执行。正常执行的run脚本,启动后,只有固定的pid号。如发现pid频繁变化,检查run脚本是否为nohup执行。
3. daemontools介绍
3.1 daemontools简介
daemontools是一个守护进程工具,防止用户进程意外退出。其启动后涉及的主要进程如下:
-
svscanboot:daemontools的根进程,svscanboot启动之后会启动svscan,svscan会启动supervise,supervise会启动并监听/service中存放服务目录下的run可执行文件。
-
svscan: svscan会为/service目录下所有服务启动supervise进程。svscan每隔5s检查下/service目录,如果有新的服务,则启动新的supervise;如果有supervise意外退出会重新启动supervise。
-
supervise:supervise用来执行/service目录下服务的run脚本。如果run脚本退出的话,会每隔几秒执行一下,所以真正干活的即是supervise进程。
3.2 daemontools服务相关命令
svc -u /service/[服务名] --启动监控
svc -d /service/[服务名] --关闭监控
svc -dk /service/[服务名] --关闭监控并且停止服务
svstat /service/[服务名] --查看服务状态
通过svstat命令,可以查看service的状态、pid和运行时间。
3.3 daemontools配置为系统服务
(1)创建daemontools.service
[root@vm1 /]# cd /etc/systemd/system
[root@vm1 system]# vim daemontools.service
文件内容如下:
[Unit]
Description=daemontools start supervise
After=getty.target
[Service]
Type=simple
User=root
Group=root
Restart=always
ExecStart=/command/svscanboot /dev/ttyS0
TimeoutSec=0
[Install]
WantedBy=multi-user.target
其中配置Restart=always保证daemontools被意外终止后,会由系统自动拉起。
(2)启动服务并设置成开机运行
[root@vm1 /]# systemctl start daemontools.service --启动服务
[root@vm1 /]# systemctl status daemontools.service --查看服务状态
[root@vm1 /]# systemctl enable daemontools.service --开机启动
注意:启动daemontools服务后,/service目录下所有run脚本都会执行,对应服务均会启动。
(3)查看服务启动状态
4. 荐言
daemontools只是我们进程的守护工具,他可以有效的在进程意外退出后可以被重新拉起。建议有条件或者能力的情况下,还是能找出进程意外退出的原因,从而从根本上解决问题所在。