前往小程序,Get更优阅读体验!
立即前往
发布
社区首页 >专栏 >Supervisor 轻松搞定Linux进程管理!让程序后台运行稳定

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

作者头像
Tinywan
发布2025-02-10 15:23:36
发布2025-02-10 15:23:36
10600
代码可运行
举报
文章被收录于专栏:开源技术小栈开源技术小栈
运行总次数:0
代码可运行

概述

‌Supervisor是用Python开发的一套通用的进程管理程序,能将一个普通的命令行进程变为后台daemon,并监控进程状态,异常退出时能自动重启。

它是通过fork/exec的方式把这些被管理的进程当作supervisor的子进程来启动,这样只要在supervisor的配置文件中,把要管理的进程的可执行文件的路径写进去即可。

也实现当子进程挂掉的时候,父进程可以准确获取子进程挂掉的信息的,可以选择是否自己启动和报警。supervisor还提供了一个功能,可以为supervisord或者每个子进程,设置一个非root的user,这个user就可以管理它对应的进程。

场景

  • Linux下如何让程序后台运行?
  • 关掉终端继续让程序运行的方法?
  • Linux ssh状态下如何后台运行程序?

优势对比

  • 相对于nohupnohup只是简单地让命令在后台运行,即使终端关闭也能继续。但是它缺乏自动重启功能,也不容易监控进程状态。而 Supervisor 可以自动重启崩溃的进程,并且可以通过supervisorctl方便地查看状态。
  • 相对于setsidsetsid也是用于让进程在新的会话中运行,但它在进程管理的便捷性上不如 Supervisor。例如,Supervisor 可以集中管理多个进程,方便地同时启动和停止多个进程,而setsid主要关注单个进程的会话分离。
  • 相对于screenscreen可以让进程在一个虚拟终端中运行,即使退出终端也能保持运行。但是它主要侧重于终端会话管理,不像 Supervisor 那样专注于进程的自动管理和监控,如自动重启、日志管理等功能。

安装

Step1 更新依赖库

代码语言:javascript
代码运行次数:0
复制
apt-get update -y

Step2 安装 supervisor

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

代码语言:javascript
代码运行次数:0
复制
apt-get install supervisor -y

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

代码语言:javascript
代码运行次数:0
复制
supervisord -v

接下来,使用以下命令验证 Supervisor 服务的状态:

代码语言:javascript
代码运行次数:0
复制
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 来启用它。

代码语言:javascript
代码运行次数:0
复制
vim /etc/supervisor/supervisord.conf

添加以下几行:

代码语言:javascript
代码运行次数:0
复制
[inet_http_server]
port=*:9001
username=admin
password=admin

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

代码语言:javascript
代码运行次数:0
复制
systemctl restart supervisor

Step4 使用Supervisor管理 redis队列进程

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

代码语言:javascript
代码运行次数:0
复制
sudo vim /etc/supervisor/conf.d/think-redis-queue.conf

添加以下几行:

代码语言:javascript
代码运行次数:0
复制
[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

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

代码语言:javascript
代码运行次数:0
复制
sudo supervisorctl reread

你应该得到以下输出:

代码语言:javascript
代码运行次数:0
复制
think-redis-queue: available

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

代码语言:javascript
代码运行次数:0
复制
sudo supervisorctl update

你应该得到以下输出:

代码语言:javascript
代码运行次数:0
复制
think-redis-queue: added process group

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

代码语言:javascript
代码运行次数:0
复制
sudo supervisorctl

你应该得到以下输出:

代码语言:javascript
代码运行次数:0
复制
think-redis-queue:think-redis-queue_00   RUNNING   pid 104745, uptime 0:23:52

如果要停止 think-redis-queue 服务,请运行以下命令:

代码语言:javascript
代码运行次数:0
复制
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配置

代码语言:javascript
代码运行次数:0
复制
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;
    }
}

常用命令

代码语言:javascript
代码运行次数:0
复制
supervisorctl status //查看所有进程的状态
supervisorctl stop es //停止es
supervisorctl start es //启动es
supervisorctl restart //重启es
supervisorctl update //配置文件修改后使用该命令加载新的配置
supervisorctl reload //重新启动配置中的所有程序

CentOS发行版

安装

代码语言:javascript
代码运行次数:0
复制
yum install supervisor

配置文件

代码语言:javascript
代码运行次数:0
复制
/etc/supervisord.conf

子配置目录

代码语言:javascript
代码运行次数:0
复制
[include]
files = supervisord.d/*.ini

编写配置 redis-queue-order-consumer.ini

代码语言:javascript
代码运行次数:0
复制
[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 命令

代码语言:javascript
代码运行次数:0
复制
supervisorctl

查看服务

代码语言:javascript
代码运行次数:0
复制
supervisor> status
redis-queue-live-consumer:redis-queue-order-consumer_00   RUNNING   pid 1692927, uptime 0:16:17

停止某个服务

代码语言:javascript
代码运行次数:0
复制
stop all

停止所有服务

代码语言:javascript
代码运行次数:0
复制
start all
本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2025-02-09,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 开源技术小栈 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 概述
  • 场景
  • 优势对比
  • 安装
    • Step1 更新依赖库
    • Step2 安装 supervisor
    • Step3 启用 Supervisor Web 界面
    • Step4 使用Supervisor管理 redis队列进程
    • Step5 访问 Supervisor Web 界面
  • 常用命令
  • CentOS发行版
    • 安装
    • 配置文件
    • 子配置目录
    • 编写配置 redis-queue-order-consumer.ini
    • supservisorctl 命令
    • 查看服务
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档