使用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 | [include] |
这样 Supervisor 就知道我们的任务来自于这个文件夹,当然这里我是相对路径,你也可以写绝对路径
6.创建守护进程配置文件
首先在4中创建的目录下,我们创建一个 xxx.conf 的文件,这个文件就是我们的守护进程详细配置了
1 | touch test.conf |
然后我们配置一下
1 | [program:test] |
这里说明一下 参数
参 数 | 说 明 |
---|---|
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 | supervisord -c /etc/supervisor/supervisord.conf 启动 |