Linux Supervisor的安装与使用入门
在linux或者unix操作系统中,守护进程(Daemon)是一种运行在后台的特殊进程,它独立于控制终端并且周期性的执行某种任务或等待处理某些发生的事件。由于在linux中,每个系统与用户进行交流的界面称为终端,每一个从此终端开始运行的进程都会依附于这个终端,这个终端被称为这些进程的控制终端,当控制终端被关闭的时候,相应的进程都会自动关闭。但是守护进程却能突破这种限制,它脱离于终端并且在后台运行,并且它脱离终端的目的是为了避免进程在运行的过程中的信息在任何终端中显示并且进程也不会被任何终端所产生的终端信息所打断。它从被执行的时候开始运转,直到整个系统关闭才退出。
此处的创建守护进程,是指发布在Linux上 asp.net core 程序的dotnet xxx.dll命令的宿主进程创建一个守护进程。
在 Linux 上有很多可以管理进程的工具,我们使用 Supervisor 来做这个事情。原因有三点:
1、它是微软官方文档推荐的,降低学习成本。
2、它并不一定是最好的,但一定是文档最全的。
3、nohup 无法后台挂起的,它也许可以帮助你
Supervisor是采用 Python(2.4+) 开发的,它是一个允许用户管理 基于 Unix 系统进程的 Client/Server 系统,提供了大量功能来实现对进程的管理。
安装
yum install -y epel-release
yum install -y supervisor
默认配置文件:/etc/supervisord.conf
进程管理配置文件放到:/etc/supervisord.d/目录下即可
配置
配置文件中 /etc/supervisord.conf 注意include的文件夹以及后缀
[include]
files = supervisord.d/*.ini
下面是配置Tomcat进程的一个例子:
[program:tomcat]
command=/opt/apache-tomcat-8.0.35/bin/catalina.sh run
stdout_logfile=/opt/apache-tomcat-8.0.35/logs/catalina.out
autostart=true
autorestart=true
startsecs=5
priority=1
stopasgroup=true
killasgroup=true
我的配置文件
[program:pierced]
command=/root/pierced/ding -config=/root/pierced/ding.cfg -subdomain=community 8081
stdout_logfile=/root/pierced/logs/catalina.out
autostart=true
autorestart=true
startsecs=5
priority=1
stopasgroup=true
killasgroup=true
启动
启动并查看是否生效,执行以下命令
supervisord -c /etc/supervisord.conf
ps -ef | grep pierced
# 返回内容
[root@localhost supervisord.d]# ps -ef | grep pierc
root 20964 20918 0 16:54 ? 00:00:00 /root/pierced/ding -config=/root/pierced/ding.cfg -subdomain=community 8081
root 21721 27871 0 16:55 pts/3 00:00:00 grep --color=auto pierc
常用命令
sudo service supervisor stop 停止supervisor服务
sudo service supervisor start 启动supervisor服务
supervisorctl shutdown #关闭所有任务
supervisorctl stop|start program_name #启动或停止服务
supervisorctl status #查看所有任务状态
# 如果新增了配置文件 可以在命令行使用 update更新子任务
sudo supervisorctl update # 默认更新全部 后面加 任务文件名 启动特定任务
管理supervisor子任务
可以使用 supervisorctl
命令在控制面板查看当前运行的任务
# 控制面板操作
supervisor> restart app # 重启任务 app任务名, 任务文件.ini中设置的 [program:app]
supervisor> stop app # 停止任务
supervisor> update app # 启动app
supervisor> status app # 查看状态
supervisor> exit # 退出
supervisor> help # 一共这么多命令
default commands (type help <topic>):
=====================================
add clear fg open quit remove restart start stop update
avail exit maintail pid reload reread shutdown status tail version
5、 配置supervisord开机启动
a.在指定目录下创建文件supervisord.service
vim /usr/lib/systemd/system/supervisord.service
b.输入以下内容:
[Unit]
Description=Supervisor daemon
[Service]
Type=forking
ExecStart=/usr/bin/supervisord -c /etc/supervisor/supervisord.conf
ExecStop=/usr/bin/supervisorctl shutdown
ExecReload=/usr/bin/supervisorctl reload
KillMode=process
Restart=on-failure
RestartSec=42s
[Install]
WantedBy=multi-user.target
保存并退出
执行以下命令:
systemctl enable supervisord
提示:
Created symlink from /etc/systemd/system/multi-user.target.wants/supervisord.service to /usr/lib/systemd/system/supervisord.service.
验证是否为开机启动:
systemctl is-enabled supervisord
提示:
enabled
表示设置成功!
至此,创建supervisor守护进程完毕。
常见问题
1.unix:///var/run/supervisor.sock no such file
问题描述:安装好supervisor没有开启服务直接使用supervisorctl报的错
解决办法:supervisord -c /etc/supervisord.conf
2.command中指定的进程已经起来,但supervisor还不断重启
问题描述:command中启动方式为后台启动,导致识别不到pid,然后不断重启,这里使用的是elasticsearch,command指定的是$path/bin/elasticsearch -d
解决办法:supervisor无法检测后台启动进程的pid,而supervisor本身就是后台启动守护进程,因此不用担心这个
3.使用过程中发现了一个很大的问题
就是执行supervisorctl shutdown 或者 supervisorctl stop的时候 任务虽然被关闭了,但是我们执行的命令还在运行 并没有被kill
服务启动后,是多进程模式,就需要注意一下,项目代码内是否有处理主进程被 kill,然后向子进程发送 kill signal,如果没有就需要到相应服务的 supervisor管理配置文件声明:stop 主进程时(主进程接收到 stop 信号),然后向同组的子进程发送 kill signal,保证子进程彻底退出,加入如下配置项即可:
killasgroup=true
stopasgroup=true