使用Supervisor创建.NET Core守护进程

今天在部署 .NET Core WebAPI 的时候发现一个问题,就是当Linux的Shell停止的时候,我的WebAPI服务也停止了,因为DotNet一直要保持RunTime模式才能让你服务持久化运行,查了一下百度,发现可以通过Linux下的一个服务软件 Supervisor 创建守护进程来持续的让你的服务保持活力。

Supervisor

supervisor管理进程,是通过fork/exec的方式将这些被管理的进程当作supervisor的子进程来启动,所以我们只需要将要管理进程的可执行文件的路径添加到supervisor的配置文件中就好了。此时被管理进程被视为supervisor的子进程,若该子进程异常中断,则父进程可以准确的获取子进程异常中断的信息,通过在配置文件中设置autostart=ture,可以实现对异常中断的子进程的自动重启。

实践

接下来,我以我 CentOS 服务器为准,记录如何实现通过 Supervisor 创建我们的 .NET Core 程序的守护进程。

1.安装Supervisor

CentOS以及所有Yum管理包的支持的Linux系统通过这个命令安装Supervisor

1
sudo yum install supervisor
2.创建Supervisor工作目录
1
mkdir /etc/supervisor
3.创建Supervisor配置文件
1
echo_supervisord_conf > /etc/supervisor/supervisord.conf
4.创建任务目录
1
mkdir /etc/supervisor/conf.d
5.创建配置文件任务目录导入规则

在4中,我们创建了一个conf.d的任务目录,这个目录里面放的就是我们的守护进程的任务配置,那么如何让Supervisor 知道我们的任务来自这个文件夹呢?所以我们还需要配置 supervisord.conf 配置文件,导入我们的任务目录

首先:

1
vim /etc/supervisor/supervisord.conf

在结尾处添加

1
2
[include]
files=conf.d/*.conf

这样 Supervisor 就知道我们的任务来自于这个文件夹,当然这里我是相对路径,你也可以写绝对路径

6.创建守护进程配置文件

首先在4中创建的目录下,我们创建一个 xxx.conf 的文件,这个文件就是我们的守护进程详细配置了

1
touch test.conf

然后我们配置一下

1
2
3
4
5
6
7
8
9
10
11
[program:test]
command=dotnet TestCore.dll
directory=/home/lingmin/TestService
environment=ASPNETCORE__ENVIRONMENT=Production
user=root
stopsignal=INT
autostart=true
autorestart=true
startsecs=1
stderr_logfile=/var/log/common.err.log
stdout_logfile=/var/log/common.out.log

这里说明一下 参数

参 数 说 明
command 动作,需要执行的命令,dontnet的命令
directory 执行动作的目录,也就是我们发布.NET Core程序的目录
user 执行命令的用户
environment 环境变量,我也没搞懂,保持默认吧
autostart 是否自动随系统启动
autorestart 遇到问题是否自动重启
startsecs 自动重启间隔时间,单位:秒
stderr_logfile 错误日志文件保存目录
stdout_logfile 输出日志文件保存目录
7.制定Supervisor配置文件

因为 Supervisor 默认的配置文件其实在 /etc/supervisord.conf 这个文件中,所以我们需要制定我们在3中创建的配置文件为Supervisor的默认配置。

1
supervisord -c /etc/supervisor/supervisord.conf

这样我们就指定了我们的配置文件

问题

我们在7中制定我们的配置文件的时候,可能会遇到

  • 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.
    For help, use /usr/bin/supervisord -h

这个错误,这个错误是说我们Supervisor已经在运行了,不能指定配置

所以我们可以通过输入这个命令,来暂时关闭掉 Supervisor 的sock通道

1
unlink /tmp/supervisor.sock

然后再输入7中的命令,就可以正常运行了

服务操作(关闭和启动)

1
2
3
4
5
6
supervisord -c /etc/supervisor/supervisord.conf  启动
supervisorctl stop all

ps -le | grep supervisord
ps aux | less
kill pid

评论