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

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

概述

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

责任编辑:武晓燕 来源: 开源技术小栈
相关推荐

2017-03-17 16:10:24

linux进程后台

2017-03-15 19:54:05

Linux进程后台

2024-01-26 10:56:47

go程序进程

2021-01-14 15:41:22

LinuxSupervisor命令

2009-12-03 11:37:56

Suse Linux

2022-10-20 17:37:46

运维智能管理平台

2009-12-11 10:47:31

Linux共享库

2009-12-11 15:37:58

Linux日志处理

2023-03-07 14:21:57

2013-04-01 10:56:02

2010-08-30 10:16:32

2009-12-15 10:19:05

Linux应用程序

2010-07-27 14:25:02

linux文件编码

2012-09-24 10:14:46

Linux系统管理

2011-04-02 10:13:36

Linux系统管理

2009-03-18 10:40:50

DHCP工作站安全网络运行

2009-03-10 17:15:07

Linux兼容内核Win程序

2022-09-29 10:51:18

ShellLinux命令审计

2015-01-27 23:21:53

Linux终端

2009-02-16 15:35:00

点赞
收藏

51CTO技术栈公众号