Supervisor,让 Python 应用稳如老狗!

Python企业级进程管理库之supervisor使用详解 Supervisor作为Python生态系统中的企业级进程管理解决方案,通过其完善的功能特性和稳定的架构设计,为现代软件系统的运维管理提供了坚实的基础支撑。该库的核心价值体现在其对系统稳定性和可管理性的双重保障,使运维团队能够构建可靠的服务运行环境。通过统一的配置管理、灵活的进程控制和完善的监控机制,Supervisor有效降低了复杂系统的运维复杂度,提升了服务的可用性和可靠性。 阅读详情

你好,我是坚持分享干货的 EarlGrey,翻译出版过《Python编程无师自通》、《Python并行计算手册》等技术书籍。

如果我的分享对你有帮助,请关注我,一起向上进击。公众号已接入 Kimi AI,欢迎在后台留言向我提问吧!

作者:Ais137

https://juejin.cn/post/7354406980784373798

1. 概述

Supervisor 是一个 C/S 架构的进程监控与管理工具,本文主要介绍其基本用法和部分高级特性,用于解决部署持久化进程的稳定性问题。

2. 问题场景

在实际的工作中,往往会有部署持久化进程的需求,比如接口服务进程,又或者是消费者进程等。这类进程通常是作为后台进程持久化运行的。

一般的部署方法是通过 nohup cmd & 命令来部署。但是这种方式有个弊端是在某些情况下无法保证目标进程的稳定性运行,有的时候 nohup 运行的后台任务会因为未知原因中断,从而导致服务或者消费中断,进而影响项目的正常运行。

为了解决上述问题,通过引入 Supervisor 来部署持久化进程,提高系统运行的稳定性。

3. Supervisor 简介

Supervisor is a client/server system that allows its users to control a number of processes on UNIX-like operating systems.

Supervisor 是一个 C/S 架构的进程监控与管理工具,其最主要的特性是可以监控目标进程的运行状态,并在其异常中断时自动重启。同时支持对多个进程进行分组管理。

完整特性详见官方文档 github 与 document。

4.部署流程

4.1. 安装 Supervisor

通过 pip 命令安装 Supervisor 工具:

pip install supervisor

PS : 根据官方文档的说明 Supervisor 不支持在 windows 环境下运行

4.2. 自定义服务配置文件

在安装完成后,通过以下命令生成配置文件到指定路径:

echo_supervisord_conf > /etc/supervisord.conf

配置文件的一些主要配置参数如下

[unix_http_server]
file=/tmp/supervisor.sock   ; the path to the socket file
;chmod=0700                 ; socket file mode (default 0700)
;chown=nobody:nogroup       ; socket file uid:gid owner
;username=user              ; default is no username (open server)
;password=123               ; default is no password (open server)

[supervisord]
logfile=/tmp/supervisord.log ; main log file; default $CWD/supervisord.log
logfile_maxbytes=50MB        ; max main logfile bytes b4 rotation; default 50MB
logfile_backups=10           ; # of main logfile backups; 0 means none, default 10
loglevel=info                ; log level; default info; others: debug,warn,trace
pidfile=/tmp/supervisord.pid ; supervisord pidfile; default supervisord.pid

[supervisorctl]
serverurl=unix:///tmp/supervisor.sock ; use a unix:// URL  for a unix socket
;serverurl=http://127.0.0.1:9001 ; use an http:// url to specify an inet socket
;username=chris              ; should be same as in [*_http_server] if set
;password=123                ; should be same as in [*_http_server] if set
;prompt=mysupervisor         ; cmd line prompt (default "supervisor")
;history_file=~/.sc_history  ; use readline history if available

;[program:theprogramname]
;command=/bin/cat              ; the program (relative uses PATH, can take args)

;[group:thegroupname]
;programs=progname1,progname2  ; each refers to 'x' in [program:x] definitions
;priority=999                  ; the relative start priority (default 999)

;[include]
;files = relative/directory/*.ini

对于上述配置参数,可以按照具体的需求进行自定义,大多数参数可以保持默认设置。但是为了方便多个项目的统一管理,需要启用 [include] 参数。该参数用于将指定文件包含到配置中,通过这种方式来 "扩展" 服务配置文件。

创建配置目录,并修改 files 参数 :

mkdir /etc/supervisord.d
[include]
files = /etc/supervisord.d/*.ini

4.3. 自定义应用配置文件

假设现在有一个测试项目 (test),里面有个 test.py 脚本需要持久化运行。现在切换到项目目录 (/root/test),并按照以下格式创建应用配置文件。

supervisor-{porject_name}.ini

配置项目的进程启动参数 :

; /root/test/supervisor-test.ini
[program:test]
command=python -u ./test.py          ; 运行命令
directory=/root/test/                ; 运行目录
redirect_stderr=true                 ; 将 stderr 重定向到 stdout
stdout_logfile=/root/test/test.log   ; 日志文件输出路径

将上述配置文件链接到服务配置文件中 [include] 参数设置的目录下 (或者复制):

ln ./supervisor-test.ini /etc/supervisord.d/supervisor-test.ini

需要注意的是,对于 supervisor 来说,上述 服务配置文件 和 应用配置文件 并没有直接区别。之所以将其划分成两类配置文件的目的在于当添加新项目时,不需要手动修改配置文件。

4.4. 启动 supervisord 服务进程

supervisord 是 supervisor 的核心服务进程,通过配置文件中的参数来创建具体的子进程,并对其进行监控与管理。通过以下命令来启动:

supervisord

默认情况下,按照以下路径顺序查找并加载配置文件

  1. ../etc/supervisord.conf (Relative to the executable)

  2. ../supervisord.conf (Relative to the executable)

  3. $CWD/supervisord.conf

  4. $CWD/etc/supervisord.conf

  5. /etc/supervisord.conf

  6. /etc/supervisor/supervisord.conf (since Supervisor 3.3.0)

也可以通过 -c 参数来指定配置文件路径。

supervisord -c conf_file_path

4.5. 启动 supervisorctl 客户端进程

supervisorctl 是 supervisor 的客户端进程,通过与 supervisord 服务进程建立 socket 连接来进行交互。使用以下命令进行交互式连接:

supervisorctl

成功连接后会显示当前运行的任务状态,或者使用 status 命令查看:

test                             RUNNING   pid 2612, uptime 0:17:06

使用 tail -f test 来查看指定应用的日志输出:

1712051907.8820918
1712051908.8822799
1712051909.8824165
1712051910.8826928
...

PS : 使用 help 命令可以查看支持的所有操作。

4.6. 验证 supervisor 的监控重启特性

文章开头描述了引入 supervisor 的主要目的,即通过监控目标进程的运行状态,并在其异常中断后自动重启来提高运行的稳定性,接下来就验证一下是否满足这个需求。

在此通过手动 kill 目标进程的方式来模拟异常中断。

(base) root:~/test# ps -ef | grep test
root      3359  2394  0 10:15 ?        00:00:00 python -u ./test.py
(base) root:~/test# kill -9 3359
(base) root:~/test# ps -ef | grep test
root      3472  2394  1 10:16 ?        00:00:00 python -u ./test.py

通过上述测试可以看到,当手动 kill 掉目标进程后,supervisor 又自动重启了目标进程 (pid 发生了变化)。

要主动退出目标进程,可以通过以下命令实现:

supervisorctl stop test

5. 高级特性

5.1. 进程组管理

对于大多数项目,通常会包含多个进程,supervisor 支持将多个进程组成一个 进程组 来进行统一管理。

通过添加 [group:thegroupname] 参数并设置 programs 字段来设置进程组。

[group:test]
programs=test-task_service, test-collector

[program:test-task_service]
command=python -u ./task_service.py
directory=/root/test/

[program:test-collector]
command=python -u ./collector.py
directory=/root/test/

进入 supervisor 并使用 update 命令后查看运行状态:

(base) root:~# supervisorctl 
test:test-collector              RUNNING   pid 1133, uptime 0:02:40
test:test-task_service           RUNNING   pid 1359, uptime 0:00:01

在使用 restart, start, stop 等命令时,可以通过指定进程组名称来进行批量操作。

supervisor> stop test:
test:test-task_service: stopped
test:test-collector: stopped

PS: 进行进程组操作时需要加上 : 号,即 cmd groupname:。

5.2. [program:x] 配置参数详解

  • command : 用于指定待运行的命令。

[program:test]
command=python -u /root/test/test.py
  • directory : 指定在执行 command 命令前切换的目录,当 command 使用相对路径时,可以与该参数配合使用。

[program:test]
command=python -u ./test.py
directory=/root/test
  • numprocs : 用于指定运行时的进程实例数量,需要与 process_name 参数配合使用。

[program:test]
command=python -u /root/test/test.py
process_name=%(program_name)s_%(process_num)s
numprocs=3
supervisor> status
test:test_0                      RUNNING   pid 2463, uptime 0:00:02
test:test_1                      RUNNING   pid 2464, uptime 0:00:02
test:test_2                      RUNNING   pid 2465, uptime 0:00:02
  • autostart : 用于控制是否在 supervisord 进程启动时同时启动 (默认为 true)

[program:test1]
command=python -u /root/test/test.py

[program:test2]
command=python -u /root/test/test.py
autostart=false
supervisor> reload
Really restart the remote supervisord process y/N? y
Restarted supervisord
supervisor> status
test1                            RUNNING   pid 3253, uptime 0:00:02
test2                            STOPPED   Not started
  • stdout_logfile : 指定标准输出流的日志文件路径。

  • stdout_logfile_maxbytes : 单个日志文件的最大字节数,当超过该值时将对日志进行切分。

  • stdout_logfile_backups : 切分日志后保留的副本数,与 stdout_logfile_maxbytes 配合使用实现滚动日志效果。

  • redirect_stderr : 将 stderr 重定向到 stdout。

[program:test]
command=python -u /root/test/test.py
stdout_logfile=/root/test/test.log
stdout_logfile_maxbytes=1KB
stdout_logfile_backups=5
redirect_stderr=true
test.log
test.log.1
test.log.2
test.log.3
test.log.4
test.log.5

5.3. supervisorctl 命令详解

supervisorctl 支持的所有操作可以通过 help 命令来查看:

supervisor> help

default commands (type help <topic>):
=====================================
add    exit      open  reload  restart   start   tail   
avail  fg        pid   remove  shutdown  status  update 
clear  maintail  quit  reread  signal    stop    version

通过 help cmd 可以查看每个命令的意义和用法:

supervisor> help restart
restart <name>          Restart a process
restart <gname>:*       Restart all processes in a group
restart <name> <name>   Restart multiple processes or groups
restart all             Restart all processes
Note: restart does not reread config files. For that, see reread and update.

其中与 supervisord 服务进程相关的命令有:

  • open : 连接到远程 supervisord 进程。

  • reload : 重启 supervisord 进程。

  • shutdown : 关闭 supervisord 进程。

而以下命令则用于进行具体的应用进程管理:

  • status : 查看应用进程的运行状态。

  • start : 启动指定的应用进程。

  • restart : 重启指定的应用进程。

  • stop : 停止指定的应用进程。

  • signal : 向指定应用进程发送信号。

  • update : 重新加载配置参数,并根据需要重启应用进程。

5.4. 应用进程的信号处理

在某些应用场景,需要在进程结束前进行一些处理操作,比如清理缓存,上传执行状态等。对于这种需求可以通过引入 signal 模块并注册相关处理逻辑,同时结合 supervisorctl 的 signal 命令来实现。

测试代码如下:

import time
import signal

# 运行标志
RUN = True

# 信号处理逻辑
def exit_handler(signum, frame):
    print(f'processing signal({signal.Signals(signum).name})')
    print("update task status")
    print("clear cache data")
    global RUN
    RUN = False

# 注册信号
signal.signal(signal.SIGTERM, exit_handler)

# 模拟持久化行为
while RUN:
    print(time.strftime("%Y-%m-%d %H:%M:%S", time.localtime(int(time.time()))))
    time.sleep(1)

print("exited")

上述代码在 signal.SIGTERM 信号上注册了一个处理函数,用来在退出之前处理相关逻辑。

通过 supervisorctl 的 signal 向目标进程发送 signal.SIGTERM(15) 信号。

supervisor> status
test                             RUNNING   pid 2855, uptime 0:00:06
supervisor> signal 15 test
test: signalled
supervisor> status
test                             EXITED    Apr 03 03:51 AM

可以看到目标进程正常退出了,再查看日志验证是否执行了 exit 函数的逻辑:

2024-04-03 03:51:34
2024-04-03 03:51:35
2024-04-03 03:51:36
2024-04-03 03:51:37
2024-04-03 03:51:38
processing signal(SIGTERM)
update task status
clear cache data
exited

日志的输出结果与代码的预期一致。

PS : stop test 与 signal 15 test 有相同的效果。

5.5. 可视化操作模式

除了使用 supervisorctl 以交互式命令行终端的形式连接 supervisord 外,还支持以可视化 web 页面的方式来操作。修改 服务配置文件 (/etc/supervisord.conf) 并启用以下配置:

[inet_http_server]         
port=0.0.0.0:9001          
username=user              
password=123

重启后访问 http://127.0.0.1:9001/ 输入认证密码后,可以看到以下页面:

7b1da58427f892dbcc43030a5a643c90.jpeg

PS : 根据配置文档中的警告,以这种模式启动时,应考虑安全问题,不应该把服务接口暴露到公网上。

6. 自动重启机制的简单分析

在上一节的 "[program:x] 配置参数详解" 部分,有几个与自动重启机制相关的关键配置参数没有描述,在此通过具体的代码实验来看看这些参数对自动重启机制的影响。

控制自动重启机制的关键参数是:

autorestart=unexpected

autorestart 参数用来确定 supervisord 服务进程是否会自动重启目标进程,其有三个可选值,根据这三个值的不同有对应的处理逻辑。

  • autorestart=unexpected : 这是默认选项,当目标进程 “异常” 退出时,服务进程将自动重启目标进程,这里的 “异常” 指的是目标进程的 exitcode 与 exitcodes 配置的参数不一致时。_exitcodes_ 配置用于指定程序 “预期” 的退出代码列表,默认为 exitcodes=0。

用以下代码来进行测试行为:

import time

def worker(end_count=5, exit_mode=1):
    count = 0
    while True:
        print(time.strftime("%Y-%m-%d %H:%M:%S", time.localtime(int(time.time()))))
        time.sleep(1)
        if count >= end_count:
            if exit_mode == 1:
                break
            elif exit_mode == 2:
                raise Exception("test")
            elif exit_mode == 3:
                exit(1)
            else:
                pass
        count += 1

worker(exit_mode=1)
# worker(exit_mode=2)
# worker(exit_mode=3)
# worker(exit_mode=4)

分别对以上 4 种退出模式进行测试,观察服务进程是否会自动重启目标进程。

  1. exit_mode == 1 : 通过 break 跳出循环正常结束

supervisor> status
test                             RUNNING   pid 5965, uptime 0:00:05
supervisor> status
test                             EXITED    Apr 03 08:59 AM

可以看到目标进程在正常结束后,服务进程不会对其自动重启。

  1. exit_mode == 2 : 通过 Exception 抛出异常,模拟内部异常导致的退出。

supervisor> status
test                             RUNNING   pid 6056, uptime 0:00:05
supervisor> status
test                             STARTING  
supervisor> status
test                             RUNNING   pid 6103, uptime 0:00:02

可以看到以这种方式退出后,服务进程会自动重启目标进程。

  1. exit_mode == 3 : 通过 exit(1) 方法返回与 exitcodes=0 不一致的退出代码来测试。

supervisor> status
test                             RUNNING   pid 6209, uptime 0:00:05
supervisor> status
test                             STARTING  
supervisor> status
test                             RUNNING   pid 6240, uptime 0:00:01

与 exit_mode == 2 的测试结果一致。

  1. exit_mode == 4 : 通过手动 kill 目标进程来测试,发现与上述结果一致。

通过配置 exitcodes 参数,可以根据具体的场景来自定义自动重启的行为,比如为每一个关键异常赋予一个退出代码,当进程出现内部异常时,可以根据这些退出代码来控制自动重启行为。

例如目标进程依赖于一个数据库,如果数据库连接失败,那么后续逻辑将无法执行,在这种情况下不需要再自动重启,因此可以在捕获该异常时产生一个对应的退出代码,比如 exit(100),然后将其配置到 exitcodes=0,100 中。这样当这个特定异常触发时,产生特殊的退出代码,从而不再重启进程。

  • autorestart=true : 当使用这种模式时,就算程序正常退出也会自动重启。

  • autorestart=false : 当使用这种模式时,将停用自动重启机制。

自动重启机制的相关源码片段如下:

# supervisor.process

@functools.total_ordering
class Subprocess(object):

    ...

    def transition(self):
        now = time.time()
        state = self.state

        self._check_and_adjust_for_system_clock_rollback(now)

        logger = self.config.options.logger

        if self.config.options.mood > SupervisorStates.RESTARTING:
            # dont start any processes if supervisor is shutting down
            if state == ProcessStates.EXITED:
                if self.config.autorestart:
                    if self.config.autorestart is RestartUnconditionally:
                        # EXITED -> STARTING
                        self.spawn()
                    else: # autorestart is RestartWhenExitUnexpected
                        if self.exitstatus not in self.config.exitcodes:
                            # EXITED -> STARTING
                            self.spawn()
            elif state == ProcessStates.STOPPED and not self.laststart:
                if self.config.autostart:
                    # STOPPED -> STARTING
                    self.spawn()
            elif state == ProcessStates.BACKOFF:
                if self.backoff <= self.config.startretries:
                    if now > self.delay:
                        # BACKOFF -> STARTING
                        self.spawn()

        ...

startsecs 是与自动重启相关的另一个配置参数。其作用是用于判断进程是否启动成功,只有当目标进程运行时间大于该配置时,才会判断成成功。

这意味着就算目标进程是正常退出的 (exitcodes=0),如果其运行时间小于设置的参数,也会判断成失败。

import time
print(time.strftime("%Y-%m-%d %H:%M:%S", time.localtime(int(time.time()))))
supervisor> status
test                             BACKOFF   Exited too quickly (process log may have details)
supervisor> status
test                             STARTING  
supervisor> status
test                             FATAL     Exited too quickly (process log may have details)
import time
print(time.strftime("%Y-%m-%d %H:%M:%S", time.localtime(int(time.time()))))
time.sleep(3)
supervisor> status
test                             RUNNING   pid 7049, uptime 0:00:02
supervisor> status
test                             EXITED    Apr 03 09:41 AM

startretries 参数需要与 startsecs 参数配合使用,用于控制目标进程的重启尝试次数,并且每次重试花费的时间间隔越来越长。可以通过以下代码测试一下:

startsecs=1
startretries=5
import time
print(time.strftime("%Y-%m-%d %H:%M:%S", time.localtime(int(time.time()))))

测试代码的输出结果如下,可以看到每次重试的间隔时间呈 1, 2, 3, ... 增长。

2024-04-03 09:59:20
2024-04-03 09:59:21
2024-04-03 09:59:23
2024-04-03 09:59:26
2024-04-03 09:59:30
2024-04-03 09:59:35

7. 总结

以上就是对 Supervisor 的简单介绍与应用,除了上述介绍的基本用法和高级特性外,还支持以 RPC 的方式进行调用,但由于现阶段还未遇到相关的应用场景,因此考虑后续深度使用后再研究相关代码。

- EOF -

文章已经看到这了,别忘了在右下角点个“赞”和“在看”鼓励哦~

推荐阅读  点击标题可跳转

1、Python 项目工程化最佳实践

2、Python 可以比 C 还要快!

3、streamlit,一个超强的 Python 库

4、豆瓣8.9分的C++经典之作,免费送!

5、Python 3.12 版本有什么变化?

最近我开了一家淘宝店,名字叫【打破壁垒】,主打程序开发相关付费素材、工具的共享类商品,帮助大家降低试错和使用成本。欢迎大家关注。

2a2493a67682131359f408bbff8ae9ae.jpeg

长按扫描下方二维码,然后点击页面中的【打开淘宝】,即可进入店铺:

2c25eaa49e37ed0920c451d0683b09eb.png

回复下方「关键词」,获取优质资源

回复关键词「 pybook03」,领取进击的Grey与小伙伴一起翻译的《Think Python 2e》电子版

回复关键词「书单02」,领取进击的Grey整理的 10 本 Python 入门书的电子版

👇关注我的公众号👇

告诉你更多细节干货

2cc689d7faa841bd2f5d2c4bc34045e7.jpeg

欢迎围观我的朋友圈

👆每天更新所想所悟

超强进程管理工具Supervisor 给大家推荐一款超强进程管理工具: Supervisor。 阅读详情

相关推荐

用SQS+多进程实现机器学习请求熔断与流量整形

消息队列(MQ)是解耦系统、平滑流量的核心中间件,其核心原理在于将同步请求-响应模型重构为异步生产-存储-消费流水线,从而提升系统弹性与资源利用率。在机器学习服务场景中,突发性高并发请求极易引发GPU显存溢出、数据库连接耗尽等雪崩问题,传统限流或自动扩缩容往往成本高、响应慢、体验差。基于AWS SQS的轻量级消息缓冲,结合Python multiprocessing绕过GIL实现真正的并行推理消费,可构建低运维、高可靠、低成本的请求节律控制系统。该方案特别适用于中小团队在预算受限下应对流量洪峰,已在图像分类

weixin_30825199的博客 425

Python实现的进程管理神器——Supervisor

Supervisor 是一款 Python 开发的进程管理系统,允许用户监视和控制 Linux 上的进程,能将一个普通命令行进程变为后台守护进程,异常退出时能自动重启

XerCis的博客 1万+

生产级机器学习服务的七道防线:从Notebook到高可用部署

机器学习模型部署不是简单地将Jupyter代码转为API,而是构建具备可观测性、弹性、安全性和可维护性的生产服务。其核心原理在于应对混沌环境下的持续运行挑战,涵盖健康探针、熔断降级、结构化追踪、资源隔离、热更新、数据漂移监控与输入沙箱等关键技术环节。这种工程化能力直接决定模型在真实业务中的稳定性与生命周期,广泛应用于推荐系统、实时风控、智能客服等高并发、低延迟场景。本文聚焦于FastAPI+ONNX Runtime技术栈下的渐进式加固实践,提供可落地的抗压型模型服务建设路径。

weixin_30580341的博客 443

Supervisor管理单个python程序

此文本人主要是用supervisor维持一个消费kafka,将数据写入db的py程序。

cv小生的博客 978

使用Supervisor管理Python进程

在上面的配置文件中,我们定义了一个名为my_program的进程。Supervisor是一个用于管理和监控进程的工具,它可以确保进程在意外中断或崩溃时能够自动重启。在Python应用程序中,使用Supervisor可以有效地管理多个进程,确保它们稳定运行。本文介绍了安装Supervisor、创建配置文件、启动Supervisor以及管理进程的方法。希望这些信息对你有所帮助!一旦完成安装,我们需要创建一个配置文件来定义要管理的进程。Supervisor将会根据配置文件中定义的进程启动相应的Python进程。

CyberLancer的博客 533

自动驾驶必备:5分钟搞懂gPTP如何实现μs级时间同步(附开源代码)

本文深入解析了gPTP协议在自动驾驶系统中实现微秒级时间同步的核心机制与工程实践。针对多传感器融合与跨域协同的严苛需求,文章拆解了gPTP的频率同步、对等延迟测量与时间偏移校正三步流程,并提供了基于linuxptp和AVnu gPTP两大开源代码库的实战配置指南与性能评估方法,助力开发者构建高精度、高可靠的车载时间同步网络。

weixin_29211309的博客 167

进程监控神器Supervisor:让你的Python应用稳如老狗!

Supervisor 是一个 C/S 架构的进程监控与管理工具,本文主要介绍其基本用法和部分高级特性,用于解决部署持久化进程的稳定性问题。Supervisor 是一个 C/S 架构的进程监控与管理工具,其最主要的特性是可以监控目标进程的运行状态,并在其异常中断时自动重启。同时支持对多个进程进行分组管理。完整特性详见官方文档 github 与 document。配置文件的一些主要配置参数如下;chmod=0700;;;;log level;;;;;;;;;;;;[include];

IT界那些事儿 755

【Blockly开发教程】01 初识Blockly

Blockly 是由 Google 开发的开源代码库,它可以为网页程序和移动端应用程序添加可视化代码编辑器。

Bright的博客 4512

神器!进程监控神器Supervisor:让你的Python应用稳如老狗!

????我的小册 45章教程:(小白零基础用Python量化股票分析小册) ,原价299,限时特价2杯咖啡,满100人涨10元。作者:Ais137https://juejin.cn/post/73544069807843737981. 概述Supervisor 是一个 C/S 架构的进程监控与管理工具,本文主要介绍其基本用法和部分高级特性,用于解决部署持久化进程的稳定性问题。2. 问题场景在实际的工作中...

cainiao_python的博客 628

新手必看!用FFmpeg一键合并ts文件的5种方法(含Windows/Mac终端命令)

本文详细介绍了使用FFmpeg合并TS视频文件的5种实用方法,涵盖Windows和Mac终端命令操作。从基础安装到进阶技巧,包括处理音频不同步、批量处理多个视频等场景,帮助用户轻松将m3u8分片视频合并为完整mp4文件,提升视频处理效率。

weixin_29065959的博客 559

CODESYS做Modbus TCP主站踩坑记:从IP配置到数据映射的完整避坑指南

本文详细记录了在CODESYS中配置Modbus TCP主站的全过程,从IP配置到数据映射的常见问题及解决方案。重点解析了网络适配器选择、Slave ID误解、地址偏移陷阱等关键问题,并提供了实用的调试技巧和性能优化建议,帮助工业通信开发者高效避坑。

weixin_30642561的博客 624

Linux服务自启与崩溃自动恢复:systemd容错配置实战

在现代Linux系统中,服务的高可用性不仅依赖代码健壮性,更取决于init系统的生命周期管理能力。systemd作为主流初始化系统,通过Restart策略、重启延迟(RestartSec)和启动限流(StartLimitIntervalSec)三大机制,构建起服务‘抗脆弱’的底层支撑。其核心价值在于将传统静态开机启动升级为动态全周期守护——既能响应计划内重启,也能感知计划外崩溃并智能恢复。典型应用场景包括7×24小时运行的Web服务(如Nginx)、监控组件(如Prometheus)及Python/Java

weixin_30367873的博客 340

猫耳语音下载(mediadown)

西宾猫耳语音下载工具,能够帮助你下载猫耳音频节目。如果你是会员,它还能帮你下载会员节目。

new_stranger的专栏 2492

机器学习模型生产化落地:轻量级服务化与可观测性实践

机器学习模型部署不是代码跑通就结束,而是进入数据漂移、API延迟、版本混乱等真实故障高发场景。其核心原理在于构建端到端的可观测性体系与最小可行服务架构,技术价值体现在降低运维复杂度、提升故障响应速度、保障业务指标稳定性。典型应用场景包括金融风控、智能客服、实时推荐等需高可用、低延迟、可解释的线上推理服务。本文聚焦FastAPI+SQLite轻量栈实现模型热更新、特征哈希驱动的数据漂移监控、fallback机制保障服务韧性,以及基于文件系统触发的原子化模型升级——用最简技术组合解决最痛生产问题。

weixin_30617695的博客 387

JAVA:Spring Boot 集成 Baidu UID-Generator ID 生成器

百度UID-Generator是一款高性能分布式ID生成器,支持600万QPS,提供Snowflake扩展版和Cache模式两种实现方式。文章详细介绍了如何在Spring Boot项目中集成该组件,包括Maven依赖配置、MySQL表结构初始化、Spring Boot数据源配置、WorkerId分配策略实现以及UID生成器的核心配置。该方案具有无中心依赖、ID单调递增、支持集群部署等特点,适用于订单号、用户ID等分布式场景。通过缓存模式(Cache-Buffer)可进一步提升性能,满足高并发业务需求。

木头 487

HandwrittenMathFormulaRecognition:基于YOLOv8的手写数学公式识别系统

输入:包含手写数学公式的图像(拍摄的板书、作业纸等)输出:对应的数字文本形式的数学公式(如LaTeX格式或文本表达式)标准的手写数学表达式数据集,包含在线轨迹及图片,广泛用于公式识别研究。包含近10万对公式图片及对应的LaTeX标注,适合训练公式识别模型。MathBrush公开手写数学公式图像数据集,含多种书写风格。手写数字与符号数据集(MNIST及其扩展)用于基础数学符号的训练。

YOLO 283

python守护进程进程池_Python—守护进程管理工具(Supervisor)

一、前言简介1、Supervisor 是一个 Python 开发的 client/server 系统,可以管理和监控类 UNIX 操作系统上面的进程。可以很方便的用来启动、重启、关闭进程(不仅仅是 Python 进程)。2、Supervisor 安装完成之后,可以编写配置文件,来满足自己的需求。为了方便,我们把配置分成两部分:supervisord(这是 server 端,对应的有 client ...

weixin_39602280的博客 940

PLC如何控制电子膨胀阀(暖通空调/制冷系统)

电子膨胀在冷水机空调系统里广泛采用,大部分空调系统都会有电子膨胀阀,但是电子膨胀阀的控制接口和普通电磁阀完全不同,所以想要PLC直接控制电子膨胀阀,还是比较麻烦的,电子膨胀阀可以理解为一个简易步进电机,体积非常小,线圈和转子部分可以分离。下面我们看下PLC如何控制电子膨胀阀。

RXXW_Dor的博客 4761

Python supervisor 强大的进程管理工具

(给Python开发者加星标,提升Python技能)作者:陈家大耳 (本文来自作者投稿)blog.youkuaiyun.com/weixin_42390791/article/det...

Python开发者 886

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

锂电池充电器电路设计 里面有电路

锂电池充电器电路设计 里面有电路 3.7V升压到5V电路设计。

Supervisor管理进程

是一个用 Python 写的进程管理工具, 可以很方便的用来启动、重启、关闭进程(不仅仅是 Python 进程). 除了对单个进程的控制, 还可以同时启动、关闭多个进程, 比如很不幸的服务器出问题导致所有应用程序都被杀死, 此时可以用 supervisor 同时启动所有应用程序而不是一个一个地敲命令启动.

wang11876的博客 1760

Outlook Express 6 (OE6) for Win7/Win8/Win10

英文版 Outlook Express6.0, 兼容Win7/Win10/WinXP,解压就可用。

Supervisor 进程管理

Supervisor简单使用,本文主要使用supervisor进程管理工具来管理nginx和uWSGI服务。图文并茂,具体详解。

weixin_56175042的博客 2380

RU DOS版、EFI版32bit/64bit BIOS常用工具

DOS版、EFI版的RU工具,可用来查看IO、MEM、PCI、SMBIOS等资源。亲测在EFI SHELL下可用。

【操作系统】Linux运维工具Supervisor(进程管理工具)

Supervisor是用Python开发的一套通用的进程管理程序,能将一个普通的命令行进程变为后台daemon,并监控进程状态,异常退出时能自动重启。目前Supervisor可以运行在大多数Unix系统上,但不支持在Windows系统上运行。Supervisor需要Python2.4及以上版本,但任何Python 3版本都不支持。

沙师弟专栏 1万+

Supervisor 详解:Python 开发者的进程管理利器

摘要: Supervisor是一款用于进程管理的Python工具,能监控、自动重启崩溃进程,统一管理多进程并记录日志。安装只需pip install supervisor,通过配置文件定义进程规则,支持Web界面管理。核心功能包括自动启动/重启、日志切割和集中管理进程(如Flask服务、定时脚本)。操作命令supervisord启动服务,supervisorctl管理进程状态。优势在于配置简单、稳定性高,适合后端服务、爬虫等长期运行任务,显著降低运维成本。

m0_58868237的博客 2226

有了Supervisor,再也不用担心程序撂挑子了!

Supervisor 是一个 C/S 架构的进程监控与管理工具,本文主要介绍其基本用法和部分高级特性,用于解决部署持久化进程的稳定性问题。Supervisor 是一个 C/S 架构的进程监控与管理工具,其最主要的特性是可以监控目标进程的运行状态,并在其异常中断时自动重启。同时支持对多个进程进行分组管理。完整特性详见官方文档 github 与 document。配置文件的一些主要配置参数如下;chmod=0700;;;;log level;;;;;;;;;;;;[include];

weixin_45512098的博客 1458

Linux进程管理工具supervisor安装及使用

1. 什么是supervisorsuperviosr是一个Linux/Unix系统上的进程监控工具,他/她upervisor是一个Python开发的通用的进程管理程序,可以管理和监控Linux上面的进程,能将一个普通的命令行进程变为后台daemon,并监控进程状态,异常退出时能自动重启。不过同daemontools一样,它不能监控daemon进程superviosr官网点此。2. 为什么用supe...

RAPIER512的专栏 1187

Python进程管理工具Supervisor

Linux下安装pipwget https://bootstrap.pypa.io/get-pip.py python get-pip.py pip -V  #查看pip版本Supervisor是基于Python的进程管理工具,可以更简单的监听、启停、重启服务器上的一个或多个后台进程,是Linux服务器管理的高效工具Supervisor管理的进程,当一个进程意外被杀死,supervisort监听到进

爱偷吃香蕉的萌猴子 862
上一篇: 推荐 30个 Chrome 灵魂插件!
下一篇: 做独立开发,千万别碰灰产,一碰就刑!
codingpy
博客等级 码龄11年 1870粉丝 104原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值