概述
Supervisor是用Python开发的一套通用的进程管理程序,能将一个普通的命令行进程变为后台daemon,并监控进程状态,异常退出时能自动重启。
它是通过fork/exec的方式把这些被管理的进程当作supervisor的子进程来启动,这样只要在supervisor的配置文件中,把要管理的进程的可执行文件的路径写进去即可。
也实现当子进程挂掉的时候,父进程可以准确获取子进程挂掉的信息的,可以选择是否自己启动和报警。supervisor还提供了一个功能,可以为supervisord或者每个子进程,设置一个非root的user,这个user就可以管理它对应的进程。
场景
- Linux下如何让程序后台运行?
- 关掉终端继续让程序运行的方法?
- Linux ssh状态下如何后台运行程序?
优势对比
- 相对于nohup:nohup只是简单地让命令在后台运行,即使终端关闭也能继续。但是它缺乏自动重启功能,也不容易监控进程状态。而 Supervisor 可以自动重启崩溃的进程,并且可以通过supervisorctl方便地查看状态。
- 相对于setsid:setsid也是用于让进程在新的会话中运行,但它在进程管理的便捷性上不如 Supervisor。例如,Supervisor 可以集中管理多个进程,方便地同时启动和停止多个进程,而setsid主要关注单个进程的会话分离。
- 相对于screen:screen可以让进程在一个虚拟终端中运行,即使退出终端也能保持运行。但是它主要侧重于终端会话管理,不像 Supervisor 那样专注于进程的自动管理和监控,如自动重启、日志管理等功能。
安装
Step1 更新依赖库
apt-get update -y
Step2 安装 supervisor
默认情况下,Supervisor 包在 Ubuntu 20.04 默认存储库中可用。您可以使用以下命令安装它:
apt-get install supervisor -y
安装 Supervisor 后,您可以使用以下命令验证已安装的 Supervisor 版本:
supervisord -v
接下来,使用以下命令验证 Supervisor 服务的状态:
sudo systemctl status supervisor
[sudo] password for www:
● supervisor.service - Supervisor process control system for UNIX
Loaded: loaded (/lib/systemd/system/supervisor.service; enabled; vendor preset: enabled)
Active: active (running) since Wed 2025-02-08 15:36:03 CST; 23min ago
Docs: http://supervisord.org
Main PID: 104478 (supervisord)
Tasks: 2 (limit: 2315)
Memory: 25.4M
CGroup: /system.slice/supervisor.service
├─104478 /usr/bin/python3 /usr/bin/supervisord -n -c /etc/supervisor/supervisord.conf
Step3 启用 Supervisor Web 界面
Supervisor 提供了一个基于 Web 的界面来管理所有进程,但默认情况下它是禁用的。您可以通过编辑文件 /etc/supervisor/supervisord.conf 来启用它。
vim /etc/supervisor/supervisord.conf
添加以下几行:
[inet_http_server]
port=*:9001
username=admin
password=admin
保存并关闭文件,然后重新启动 Supervisor 服务以应用更改:
systemctl restart supervisor
Step4 使用Supervisor管理 redis队列进程
您需要为要管理的每个服务创建一个独立的配置文件。您可以使用以下命令创建 think-redis-queue 配置文件:
sudo vim /etc/supervisor/conf.d/think-redis-queue.conf
添加以下几行:
[program:think-redis-queue]
command=/usr/local/php-8.3.7/bin/php /home/www/website/train.tinywan.com/think redis-queue consumer
autostart=true
autorestart=true
startretries=5
numprocs=1
startsecs=0
process_name=%(program_name)s_%(process_num)02d
stderr_logfile=/var/log/supervisor/%(program_name)s_stderr.log
stderr_logfile_maxbytes=10MB
stdout_logfile=/var/log/supervisor/%(program_name)s_stdout.log
stdout_logfile_maxbytes=10MB
完成后保存并关闭文件。接下来,告诉主管了解新配置:
sudo supervisorctl reread
你应该得到以下输出:
think-redis-queue: available
接下来,告诉 Supervisor 启动 think-redis-queue 服务:
sudo supervisorctl update
你应该得到以下输出:
think-redis-queue: added process group
接下来,使用以下命令验证 Supervisor 是否启动了 think-redis-queue服务:
sudo supervisorctl
你应该得到以下输出:
think-redis-queue:think-redis-queue_00 RUNNING pid 104745, uptime 0:23:52
如果要停止 think-redis-queue 服务,请运行以下命令:
supervisor> stop think-redis-queue:think-redis-queue_00
think-redis-queue:think-redis-queue_00: stopped
supervisor> start think-redis-queue:think-redis-queue_00
think-redis-queue:think-redis-queue_00: started
supervisor>
Step5 访问 Supervisor Web 界面
图片
Nginx配置
server {
listen 443 ssl http2;
server_name supervisor.tinywan.cn;
ssl_certificate /home/www/.acme.sh/supervisor.tinywan.cn/supervisor.tinywan.cn.cer;
ssl_certificate_key /home/www/.acme.sh/supervisor.tinywan.cn/supervisor.tinywan.cn.key;
location / {
proxy_pass http://0.0.0.0:9001;
proxy_buffering off;
}
}
常用命令
supervisorctl status //查看所有进程的状态
supervisorctl stop es //停止es
supervisorctl start es //启动es
supervisorctl restart //重启es
supervisorctl update //配置文件修改后使用该命令加载新的配置
supervisorctl reload //重新启动配置中的所有程序
CentOS发行版
安装
yum install supervisor
配置文件
/etc/supervisord.conf
子配置目录
[include]
files = supervisord.d/*.ini
编写配置 redis-queue-order-consumer.ini
[program:redis-queue-order-consumer]
command=/usr/local/php-8.4/bin/php /home/wwwroot/order.tinywan.com/think redis-queue order-consumer
user=www
autostart=true
autorestart=true
startretries=5
numprocs=1
startsecs=0
process_name=%(program_name)s_%(process_num)02d
stderr_logfile=/var/log/supervisor/%(program_name)s_stderr.log
stderr_logfile_maxbytes=10MB
stdout_logfile=/var/log/supervisor/%(program_name)s_stdout.log
stdout_logfile_maxbytes=10MB
supservisorctl 命令
supervisorctl
查看服务
supervisor> status
redis-queue-live-consumer:redis-queue-order-consumer_00 RUNNING pid 1692927, uptime 0:16:17
停止某个服务
stop all
停止所有服务
start all