1、守护进程是什么?
在linux或者unix操作系统中,守护进程(Daemon)是一种运行在后台的特殊进程,它独立于控制终端并且周期性的执行某种任务或等待处理某些发生的事件。由于在linux中,每个系统与用户进行交流的界面称为终端,每一个从此终端开始运行的进程都会依附于这个终端,这个终端被称为这些进程的控制终端,当控制终端被关闭的时候,相应的进程都会自动关闭。但是守护进程却能突破这种限制,它脱离于终端并且在后台运行,并且它脱离终端的目的是为了避免进程在运行的过程中的信息在任何终端中显示并且进程也不会被任何终端所产生的终端信息所打断。它从被执行的时候开始运转,直到整个系统关闭才退出。在 Linux 上有很多可以管理进程的工具,我们使用 Supervisor 来做这个事情。
原因有两点:
①、它是微软官方文档推荐的,降低学习成本。
②、它并不一定是最好的,但一定是文档最全的。
2、Supervisor概述
Supervisor是一个客户端/服务器系统,用 Python 开发的一套通用的进程管理程序,能将一个普通的命令行进程变为后台 daemon,并监控进程状态,异常退出时能自动重启。supervisor 还能很友好的管理程序在命令行上输出的日志,可以将日志重定向到自定义的日志文件中,还能按文件大小对日志进行分割。supervisor主要包含以下四个部分:
supervisord:supervisord是supervisor的服务端,负责管理我们配置的子进程,包括重启崩溃或异常退出的子进程,同时也响应来自客户端的请求。
supervisorctl:supervisord的客户端命令行。我们可以通过supervisorctl获得由主进程控制的子进程的状态,停止和启动子进程,并获得主进程的运行列表。
Web Server:和supervisorctl功能差不多,是通过web界面查看和控制进程状态。
XML-RPC Interface:服务于web UI的同一个HTTP服务器提供一个XML-RPC接口,可以用来询问和控制管理程序及其运行的程序。
3、安装Supervisor
#执行epel-release
sudo yum -y install epel-release
#安装Supervisor
sudo yum -y install supervisor
#通过配置文件来启动supervisor
sudo supervisord -c /etc/supervisord.conf
#启动supervisorctl
sudo supervisorctl -c /etc/supervisord.conf
#查看supervisor 版本
version
4、创建Supervisor配置文件
进入supervisord.d目录
cd /etc/supervisord.d
新建NetCore进程配置文件
sudo touch WsServerNetCore.ini
查看和编辑WsServerNetCore.ini配置文件
sudo vim WsServerNetCore.ini
进入文件后,按“i”或者“a”进入插入模式,插入下面的配置信息
#配置程序名称
[program:HyWebSocketServer]
#运行程序的命令
command=dotnet HyWebSocketServer.dll
#命令执行的目录
directory=~/publish
#进程环境变量
environment=ASPNETCORE_ENVIRONMENT=Production
#进程执行的用户身份
user=root
#进程停止信号,可以为TERM, HUP, INT, QUIT, KILL, USR1, or USR2等信号默认为TERM >。当用设定的信号去干掉进程,退出码会被认为是expected,非必须设置
stopsignal=INT
#如果是true的话,子进程将在supervisord启动后被自动启动,默认就是true,非必须设置
autostart=true
#这个是设置子进程挂掉后自动重启的情况,有三个选项,false,unexpected和true。如果>为false的时候,无论什么情况下,都不会被重新启动,如果为unexpected,只有当进程的>退出码不在下面的exitcodes里面定义的退出码的时候,才会被自动重启。当为true的时候>>,只要子进程挂掉,将会被无条件的重启
autorestart=true
#这个选项是子进程启动多少秒之后,此时状态如果是running,则我们认为启动成功了,默认值为1,非必须设置
startsecs=1
#错误日志文件
stderr_logfile=~/HyWebSocketServer/hyWebSocketServer.err.log
#输出日志文件
stdout_logfile=~/HyWebSocketServer/hyWebSocketServer.out.log
按ESC,输入命令:wq保存配置文件
5、启动supervisor
启动方式1:通过supervisor服务端使用配置文件启动
sudo supervisord -c /etc/supervisord.conf
启动方式2:通过客户端命令行启动
#先启动supervisorctl
sudo supervisorctl -c /etc/supervisord.conf
#重新加载配置文件
reload
#查看运行的状态
status
可能出现了以下错误:
错误一:
Error: Another program is already listening on a port that one of our HTTP servers is configured to use. Shut this program down first before starting supervisord.
解决方法:
ps aux | grep supervisord
kill - 9 进程ID
错误二:
Unlinking stale socket /var/run/supervisor/supervisor.sock
解决方法:
unlink /var/run/supervisor/supervisor.sock
测试下站点是否运行正常
#查看相关进行
ps -aux | grep "HyWebSocketServer.dll"
#访问启动的站点
https://ip:9000
注意:这里有个问题就是,当Linux系统关机后,Supervisor可能不会自己开启,导致需要手动执行sudo supervisord -c /etc/supervisord.conf 命令之后,Dotnet进程才会自动启动
6、Supervisor开机自启动
#进入system目录
cd /usr/lib/systemd/system
#编辑supervisord.service文件
sudo vim supervisord.service
supervisord.service文件内容如下
[Unit]
Description=Process Monitoring and Control Daemon
After=rc-local.service nss-user-lookup.target
[Service]
Type=forking
ExecStart=/usr/bin/supervisord -c /etc/supervisord.conf
ExecStop=/usr/bin/supervisorctl shutdown
ExecReload=/usr/bin/supervisorctl reload
KillMode=process
Restart=on-failure
RestartSec=42
[Install]
WantedBy=multi-user.target
编辑好后保存退出,然后执行命令,查看是否启动成功
#启动服务
systemctl enable supervisord
#验证一下是否为开机启动
systemctl is-enabled supervisord
7、守护进程的效果
直接干掉Dotnet进程,看看会不会自动启动
#查看dotnet进程
ps -aux|grep dotnet
#强制杀死dotnet进程
kill -9 PID
#再次查看dotnet进程
ps -aux|grep dotnet
重启Linux,然后直接访问站点