Linux下部署.net5.0服务后增加Supervisor守护进程
2021/8/5 7:09:56
本文主要是介绍Linux下部署.net5.0服务后增加Supervisor守护进程,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!
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,然后直接访问站点
这篇关于Linux下部署.net5.0服务后增加Supervisor守护进程的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!
- 2022-03-01沐雪多租宝商城源码从.NetCore3.1升级到.Net6的步骤
- 2024-12-06使用Microsoft.Extensions.AI在.NET中生成嵌入向量
- 2024-11-18微软研究:RAG系统的四个层次提升理解与回答能力
- 2024-11-15C#中怎么从PEM格式的证书中提取公钥?-icode9专业技术文章分享
- 2024-11-14云架构设计——如何用diagrams.net绘制专业的AWS架构图?
- 2024-05-08首个适配Visual Studio平台的国产智能编程助手CodeGeeX正式上线!C#程序员必备效率神器!
- 2024-03-30C#设计模式之十六迭代器模式(Iterator Pattern)【行为型】
- 2024-03-29c# datetime tryparse
- 2024-02-21list find index c#
- 2024-01-24convert toint32 c#