Supervisor 轻松搞定Linux进程管理!让程序后台运行稳定

概述

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 -y1.

Step2 安装 supervisor

默认情况下,Supervisor 包在 Ubuntu 20.04 默认存储库中可用。您可以使用以下命令安装它:

复制
apt-get install supervisor -y1.

安装 Supervisor 后,您可以使用以下命令验证已安装的 Supervisor 版本:

复制
supervisord -v1.

接下来,使用以下命令验证 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.conf1.2.3.4.5.6.7.8.9.10.11.

Step3 启用 Supervisor Web 界面

Supervisor 提供了一个基于 Web 的界面来管理所有进程,但默认情况下它是禁用的。您可以通过编辑文件 /etc/supervisor/supervisord.conf 来启用它。

复制
vim /etc/supervisor/supervisord.conf1.

添加以下几行:

复制
[inet_http_server] port=*:9001 username=admin password=admin1.2.3.4.

保存并关闭文件,然后重新启动 Supervisor 服务以应用更改:

复制
systemctl restart supervisor1.

Step4 使用Supervisor管理 redis队列进程

您需要为要管理的每个服务创建一个独立的配置文件。您可以使用以下命令创建 think-redis-queue 配置文件:

复制
sudo vim /etc/supervisor/conf.d/think-redis-queue.conf1.

添加以下几行:

复制
[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=10MB1.2.3.4.5.6.7.8.9.10.11.12.

完成后保存并关闭文件。接下来,告诉主管了解新配置:

复制
sudo supervisorctl reread1.

你应该得到以下输出:

复制
think-redis-queue: available1.

接下来,告诉 Supervisor 启动 think-redis-queue 服务:

复制
sudo supervisorctl update1.

你应该得到以下输出:

复制
think-redis-queue: added process group1.

接下来,使用以下命令验证 Supervisor 是否启动了 think-redis-queue服务:

复制
sudo supervisorctl1.

你应该得到以下输出:

复制
think-redis-queue:think-redis-queue_00 RUNNING pid 104745, uptime 0:23:521.

如果要停止 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>1.2.3.4.5.

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; } }1.2.3.4.5.6.7.8.9.10.11.12.

常用命令

复制
supervisorctl status //查看所有进程的状态 supervisorctl stop es //停止es supervisorctl start es //启动es supervisorctl restart //重启es supervisorctl update //配置文件修改后使用该命令加载新的配置 supervisorctl reload //重新启动配置中的所有程序1.2.3.4.5.6.

CentOS发行版

安装

复制
yum install supervisor1.

配置文件

复制
/etc/supervisord.conf1.

子配置目录

复制
[include] files = supervisord.d/*.ini1.2.

编写配置 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=10MB1.2.3.4.5.6.7.8.9.10.11.12.13.

supservisorctl 命令

复制
supervisorctl1.

查看服务

复制
supervisor> status redis-queue-live-consumer:redis-queue-order-consumer_00 RUNNING pid 1692927, uptime 0:16:171.2.

停止某个服务

复制
stop all1.

停止所有服务

复制
start all1.

THE END
本站服务器由亿华云赞助提供-企业级高防云服务器