之前在Asp.Net Core 3.1 发布至Linux中已经成功的在CentOS8中运行了Asp.Net Core站点。但是,该站点是手动启动服务,因此有必要对ASP.NET Core网站应用进行监控,使网站可以持续运行,不然退出Shell后网站就停止了。官方推荐使用Supervisor进行监控。很多文章都已经写了如何安装Supervisor和配置Supervisor的文章,但参考之后却没那么顺利。因此,将自己的安装和配置过程记录下来被查。
主要环境
- CentOS Linux release 8.1.1911 (x64)
- Python 3.6.8
- supervisor-4.1.0
安装Supervisor
多数文章里,安装Supervisor要么这样安装:
  yum install supervisor
要么这样安装
yum install python-setuptools
easy_install supervisor
但是,对于我的环境而言,却没有成功。经查,“python版本要求2.4以上, 且不能是python3, supervisor不能运行在任何python3版本上。”幸运的是,在我安装的时候,supervisor已经支持python3了。但需要使用pip安装。
1.安装supervisor
[dotnba@CentOS8 ~]$ sudo pip3 install supervisor
WARNING: Running pip install with root privileges is generally not a good idea. Try `pip3 install --user` instead.
Collecting supervisor
Downloading https://files.pythonhosted.org/packages/ca/1f/07713b0e1e34c312450878801d496bce8b9eff5ea9e70d41ff4e299b2df5/supervisor-4.1.0-py2.py3-none-any.whl (318kB)
100% |████████████████████████████████| 327kB 2.4MB/s
Installing collected packages: supervisor
Successfully installed supervisor-4.1.0
supervisor安装完成后,会在/usr/local/bin下生成三个执行程序:supervisortd、supervisorctl、echo_supervisord_conf,分别是supervisor的守护进程服务(用于接收进程管理命令)、客户端(用于和守护进程通信,发送管理进程的指令)、生成初始配置文件程序。
[dotnba@CentOS8 ~]$ cd /usr/local/bin
[dotnba@CentOS8 bin]$ dir
echo_supervisord_conf pidproxy supervisorctl supervisord
2.生成配置文件
在当前用户的主目录下生成配置文件:
[dotnba@CentOS8 bin]$ cd /home/dotnba
[dotnba@CentOS8 ~]$ mkdir supervisor
[dotnba@CentOS8 ~]$ cd supervisor
[dotnba@CentOS8 supervisor]$ echo_supervisord_conf > supervisord.conf
[dotnba@CentOS8 supervisor]$ ls
supervisord.conf
3.修改配置文件
创建自定义配置文件夹:
[dotnba@CentOS8 supervisor]$ pwd
/home/dotnba/supervisor
[dotnba@CentOS8 supervisor]$ mkdir conf.d
修改配置文件
[dotnba@CentOS8 supervisor]$ vim supervisord.conf
将配置文件最后修改为:
[include]
;files = relative/directory/*.ini
;自定义配置文件放置位置
files = conf.d/*.conf
4.启动supervisor服务
[dotnba@CentOS8 supervisor]$ pwd
/home/dotnba/supervisor
[dotnba@CentOS8 supervisor]$ supervisord -c supervisord.conf
为Asp.Net Core站点配置守护程序
1. 为为Asp.Net Core站点创建配置文件
[dotnba@CentOS8 conf.d]$ pwd
/home/dotnba/supervisor/conf.d
[dotnba@CentOS8 conf.d]$ cat>>WebApiDemo.conf
文件内容如下:
[program:WebApiDemo]
command=dotnet WebApiDemo.dll ; 运行程序的命令
directory=/home/dotnba/dotnet/ ; 命令执行的目录
environment=ASPNETCORE_ENVIRONMENT=Production ; 进程环境变量
user=dotnba ; 进程执行的用户身份
stopsignal=INT
autostart=true
autorestart=true ; 程序意外退出是否自动重启
startsecs=3 ;/自动重启间隔
stderr_logfile=/var/log/supervisor/WebApiDemo.err.log ; 错误日志文件
stdout_logfile=/var/log/supervisor/WebApiDemo.out.log ; 输出日志文件
2. 重新加载配置文件
[dotnba@CentOS8 conf.d]$ supervisorctl reload
3. 日志权限问题
通常,大多数文章到此为止。但当我们查看supervisor状态时,却可能并不正常。
[dotnba@CentOS8 conf.d]$ supervisorctl status
'INFO spawnerr: unknown error making dispatchers for 'WebApiDemo': EACCES'
解决办法,首先是要确保supervisor文件夹和WebApiDemo.err.log及WebApiDemo.out.log文件存在,并为它们授予权限。
[dotnba@CentOS8 conf.d]$ sudo mkdir /var/log/supervisor
[dotnba@CentOS8 conf.d]$ cat>> /var/log/supervisor/WebApiDemo.err.log
[dotnba@CentOS8 conf.d]$ cat>> /var/log/supervisor/WebApiDemo.out.log
[dotnba@CentOS8 conf.d]$ sudo chmod 777 /var/log/supervisor/WebApiDemo.err.log
[dotnba@CentOS8 conf.d]$ sudo chmod 777 /var/log/supervisor/WebApiDemo.out.log
4. 重启,查看状态
[dotnba@CentOS8 supervisor]$ supervisorctl -c supervisord.conf restart all
[dotnba@CentOS8 supervisor]$ supervisorctl status
WebApiDemo RUNNING pid 5254, uptime 0:00:19
[dotnba@CentOS8 supervisor]$ ps -ef | grep WebApiDemo
dotnba 5254 3463 0 17:21 ? 00:00:00 dotnet WebApiDemo.dll
dotnba 5426 3421 0 17:25 pts/0 00:00:00 grep --color=auto WebApiDemo
开机启动Supervisor服务
1. 创建supervisor.service文件
进入/lib/systemd/system目录,并创建supervisor.service文件,该文件内容如下所示。
# 先查看程序的路径
[dotnba@CentOS8 system]$ whereis supervisord
supervisord: /usr/local/bin/supervisord /usr/local/bin/supervisord.conf
[dotnba@CentOS8 system]$ whereis supervisorctl
supervisorctl: /usr/local/bin/supervisorctl
[dotnba@CentOS8 system]$ cd /lib/systemd/system
[dotnba@CentOS8 system]$sudo vim supervisor.service
配置文件内容如下:
[Unit]
Description=supervisor
After=network.target
[Service]
Type=forking
ExecStart=/usr/local/bin/supervisord -c /home/dotnba/supervisor/supervisord.conf
ExecStop=/usr/local/bin/supervisorctl $OPTIONS shutdown
ExecReload=/usr/local/bin/supervisorctl $OPTIONS reload
KillMode=process
Restart=on-failure
RestartSec=42s
[Install]
WantedBy=multi-user.target
2. 设置开机启动
[dotnba@CentOS8 system]$ systemctl enable supervisor.service
Created symlink /etc/systemd/system/multi-user.target.wants/supervisor.service → /usr/lib/systemd/system/supervisor.service.
[dotnba@CentOS8 system]$ systemctl daemon-reload
[dotnba@CentOS8 system]$ service supervisor status
Redirecting to /bin/systemctl status supervisor.service
● supervisor.service - supervisor
Loaded: loaded (/usr/lib/systemd/system/supervisor.service; enabled; vendor preset: disabled)
Active: active (running) since Tue 2020-02-04 18:17:04 CST; 34s ago
Process: 4469 ExecStart=/usr/local/bin/supervisord -c /home/dotnba/supervisor/supervisord.conf (code=exited, status=0/SUCCESS)
Main PID: 4472 (supervisord)
Tasks: 16 (limit: 23832)
Memory: 75.7M
CGroup: /system.slice/supervisor.service
├─4472 /usr/bin/python3.6 /usr/local/bin/supervisord -c /home/dotnba/supervisor/supervisord.conf
└─4473 dotnet WebApiDemo.dll
2月 04 18:17:03 CentOS8 systemd[1]: Starting supervisor...
2月 04 18:17:04 CentOS8 systemd[1]: Started supervisor.
3.修改文件权限为766
[dotnba@CentOS8 system]$ sudo chmod 766 supervisor.service
参考文章:
1.Python3支持的Supervisor安装与配置,监控进程状态: https://www.jianshu.com/p/ba6327f198ce
2. supervisor 错误集合:https://www.cnblogs.com/52forjie/p/10057999.html
3. Supervisor踩过的坑:https://www.cnblogs.com/drek_blog/p/10998034.html