如何配置Linux进程守护 supervisor进程管理方案

supervisor 是一个 linux 进程管理工具,能确保关键进程持续运行并在崩溃时自动重启。1. 安装 supervisor:在 debian/ubuntu 上使用 apt,centos/rhel 上使用 yum;2. 创建配置文件定义进程,包括 command、user、autostart、autorestart 等参数;3. 更新配置使用 supervisorctl reread 与 update;4. 使用 supervisorctl 命令管理进程启停与状态查看;5. 设置开机自启动通过 systemctl 或 update-rc.d;6. startsecs 参数用于判定进程启动成功所需时间;7. 使用 [group:] 定义进程组可统一管理多个进程;8. 监控资源需结合 ps、top 或专业工具如 prometheus 实现。

如何配置Linux进程守护 supervisor进程管理方案

Supervisor 是一个强大的进程管理工具,它能确保你的 Linux 系统上的关键进程持续运行,并在进程崩溃时自动重启。配置 Supervisor 的关键在于创建一个或多个配置文件,定义你要管理的进程,然后让 Supervisor 读取这些配置并启动、监控这些进程。

如何配置Linux进程守护 supervisor进程管理方案

解决方案

安装 Supervisor:

如何配置Linux进程守护 supervisor进程管理方案

在 Debian/Ubuntu 上:

sudo apt updatesudo apt install supervisor

在 CentOS/RHEL 上:

如何配置Linux进程守护 supervisor进程管理方案

sudo yum install epel-release  # 如果没有 EPEL 仓库sudo yum install supervisor

创建配置文件:

Supervisor 的配置文件通常位于

/etc/supervisor/conf.d/

目录下。为你的每个进程创建一个单独的配置文件,例如

my_app.conf

sudo nano /etc/supervisor/conf.d/my_app.conf

配置文件内容示例:

[program:my_app]command=/path/to/your/application  ; 启动命令user=your_user                      ; 运行用户autostart=true                    ; Supervisor 启动时自动启动autorestart=true                  ; 进程崩溃时自动重启redirect_stderr=true              ; 重定向标准错误输出stdout_logfile=/var/log/my_app.log ; 标准输出日志文件
[program:my_app]

:定义进程名称,

my_app

可以自定义。

command

:进程的启动命令,替换为你的应用程序的实际路径。

user

:运行进程的用户,建议使用非 root 用户。

autostart

:设置为

true

,使 Supervisor 在启动时自动启动该进程。

autorestart

:设置为

true

,使 Supervisor 在进程意外退出时自动重启它。

redirect_stderr

:设置为

true

,将标准错误输出重定向到日志文件。

stdout_logfile

:指定标准输出的日志文件路径。

更新 Supervisor 配置:

创建或修改配置文件后,需要让 Supervisor 重新加载配置。

sudo supervisorctl rereadsudo supervisorctl update
reread

:重新读取所有配置文件。

update

:根据新的配置启动或停止进程。

启动、停止和重启进程:

使用

supervisorctl

命令管理进程。

sudo supervisorctl start my_app    ; 启动 my_app 进程sudo supervisorctl stop my_app     ; 停止 my_app 进程sudo supervisorctl restart my_app  ; 重启 my_app 进程sudo supervisorctl status my_app   ; 查看 my_app 进程状态sudo supervisorctl status           ; 查看所有进程状态

开机自启动 Supervisor:

Supervisor 通常会自动配置为开机自启动。如果没有,可以使用以下命令手动配置:

豆包AI编程 豆包AI编程

豆包推出的AI编程助手

豆包AI编程 483 查看详情 豆包AI编程

在 systemd 系统上 (例如 Ubuntu 16.04+, CentOS 7+):

sudo systemctl enable supervisor

在 SysVinit 系统上 (较旧的 Linux 发行版):

sudo update-rc.d supervisor defaults

Supervisor 配置文件中的

startsecs

参数有什么用?

startsecs

参数定义了进程在启动后被 Supervisor 认为“成功启动”所需的时间(秒)。如果进程在

startsecs

秒内退出,Supervisor 会认为启动失败,并根据

autorestart

设置进行处理(通常是重启)。这个参数对于那些启动需要一些时间的服务非常有用,可以避免 Supervisor 误判进程启动失败而频繁重启。 默认值是 1 秒,但对于启动缓慢的应用程序,可能需要调整到 5 秒甚至更长。

如何使用 Supervisor 管理多个进程组?

Supervisor 支持进程组的概念,允许你同时管理多个相关的进程。你可以在配置文件中使用

[group:group_name]

来定义一个进程组,然后将多个进程添加到该组中。

例如:

[group:web_app]programs=my_app, celery_worker[program:my_app]command=/path/to/your/web_appuser=www-dataautostart=trueautorestart=true[program:celery_worker]command=/path/to/your/celery_workeruser=www-dataautostart=trueautorestart=true

然后,你可以使用

supervisorctl

命令来管理整个进程组:

sudo supervisorctl start web_app:*  ; 启动 web_app 组中的所有进程sudo supervisorctl stop web_app:*   ; 停止 web_app 组中的所有进程sudo supervisorctl restart web_app:* ; 重启 web_app 组中的所有进程sudo supervisorctl status web_app:*  ; 查看 web_app 组中所有进程的状态

注意,

web_app:*

中的

*

是通配符,表示该组中的所有进程。

如何监控 Supervisor 管理的进程的 CPU 和内存使用情况?

Supervisor 本身不提供直接的 CPU 和内存监控功能。但是,你可以结合其他工具来实现这个目标。一个常见的方法是使用

ps

命令结合

awk

top

命令来获取进程的 CPU 和内存使用情况,然后将这些信息记录到日志文件中。

例如,你可以创建一个脚本,定期运行以下命令,并将结果写入日志文件:

#!/bin/bashprocess_name="my_app"  # 替换为你的进程名称pid=$(pidof $process_name)if [ -n "$pid" ]; then  cpu_usage=$(ps -p $pid -o %cpu | tail -n 1)  mem_usage=$(ps -p $pid -o %mem | tail -n 1)  echo "$(date) - CPU: $cpu_usage%, Memory: $mem_usage%" >> /var/log/my_app_resource.logelse  echo "$(date) - Process '$process_name' not found." >> /var/log/my_app_resource.logfi

然后,你可以使用 Supervisor 来管理这个监控脚本,并设置定期执行。 另一种选择是使用更专业的监控工具,例如 Prometheus 或 Grafana,它们可以提供更全面的监控指标和可视化界面。 你需要配置这些工具来收集 Supervisor 管理的进程的指标,并将数据展示出来。 具体的配置方法取决于你选择的监控工具。

以上就是如何配置Linux进程守护 supervisor进程管理方案的详细内容,更多请关注创想鸟其它相关文章!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 chuangxiangniao@163.com 举报,一经查实,本站将立刻删除。
发布者:程序猿,转转请注明出处:https://www.chuangxiangniao.com/p/445285.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2025年11月7日 20:32:19
下一篇 2025年11月7日 20:33:13

相关推荐

  • Go语言中获取变量类型字符串的实用方法

    在go语言中,获取变量的类型并以字符串形式打印是一个常见需求。本文将介绍如何使用`fmt.printf`函数的`%t`格式化动词来高效、简洁地实现这一目标,避免了类似javascript `typeof`或python `type`操作符的误区。通过一个简单的示例,读者将掌握在go中获取变量类型字符…

    2025年12月16日
    000
  • Golang如何使用命令模式封装操作

    命令模式将请求封装为对象,实现发送者与接收者的解耦。Go通过接口和组合实现该模式:定义Command接口及具体命令如LightOnCommand,由Receiver(如Light)执行实际逻辑,Invoker(如RemoteControl)触发命令,Client组装并传递命令。支持扩展Undo操作,…

    2025年12月16日
    000
  • Golang 中 Ticker 的停止行为详解与最佳实践

    本文深入探讨了 Golang 中 `time.Ticker` 的停止行为,揭示了直接调用 `Stop()` 方法后,goroutine 可能无法退出的问题。文章提供了一种利用额外 channel 来优雅地控制 Ticker 的生命周期,确保资源正确释放,并避免 goroutine 泄漏的最佳实践方案…

    2025年12月16日
    000
  • Go 语言中的 Rune 类型详解

    本文旨在深入解析 Go 语言中的 `rune` 类型,阐明其本质、用途以及与 `int32` 的关系。`rune` 类型是 `int32` 的别名,用于表示 Unicode 码点,旨在区分数值和字符值。本文将解释 `rune` 的含义来源,并提供示例说明其在实际编程中的应用。 Go 语言中的 run…

    2025年12月16日
    000
  • 编程语言中操作符与函数的深度解析

    编程语言中操作符与函数的界限并非一成不变,其区分度取决于具体语言的设计哲学。在某些语言中,操作符是固定的内置语法元素(如C语言),而在另一些语言中,它们可以被重载或甚至作为普通函数处理(如C++和Haskell)。理解这一差异对于掌握不同语言的特性至关重要,例如Go语言中new被明确视为一个函数而非…

    2025年12月16日
    000
  • Go与C++互操作:使用SWIG处理std::string参数的现代化实践

    本文详细阐述了如何利用swig在go语言与c++++之间高效地传递`std::string`参数。通过采用go 1.3.3及swig 3.0.2及更高版本提供的现代化方法,特别是借助`go build`的自动化能力,并结合`const std::string&`的规范使用,可以显著简化go与…

    2025年12月16日
    000
  • 在Go语言中实现策略模式:灵活处理多变业务逻辑

    本文深入探讨了在go语言中实现策略模式的方法,旨在帮助开发者灵活处理多变的业务逻辑。通过定义清晰的接口,实现具体的策略,并采用嵌入或参数传递的方式将策略集成到上下文结构中,go语言能够以简洁高效的方式实现行为的动态切换,同时强调了go语言中优先使用接口而非过度依赖设计模式的编程哲学。 理解策略模式及…

    2025年12月16日
    000
  • 使用 Go 优雅高效地将 Map 写入 http.ResponseWriter

    本文介绍如何使用 Go 语言将键值对 Map 以 Key-Value Form 编码格式写入 `http.ResponseWriter`。我们将探讨使用 `net/url` 包的 `Values` 类型来实现高效且符合规范的编码,避免手动拼接字符串可能带来的错误,并提供代码示例和注意事项,帮助你轻松…

    2025年12月16日
    000
  • 解决 Golang HTTP GET 请求在某些 URL 上崩溃的问题

    本文旨在帮助开发者解决 Golang 中使用 `http.Get` 方法请求某些特定 URL 时,程序出现 “panic: runtime error: index out of range” 运行时错误的问题。通过分析问题可能的原因,并提供示例代码和调试建议,帮助读者定位并…

    2025年12月16日
    000
  • Go语言中自定义字节类型切片与标准字节切片之间的转换

    本文旨在解决Go语言中自定义字节类型(例如 type myByte byte)的切片与标准字节切片 []byte 之间的转换问题。通过示例代码和详细解释,我们将探讨如何安全、高效地实现这种转换,以及需要注意的类型安全问题。 在Go语言中,如果定义了一个新的字节类型,例如 type myByte by…

    2025年12月16日
    000
  • 将数据库查询结果转换为Go中的Map:实用指南

    本文旨在指导开发者如何将数据库查询结果转换为Go语言中的[]map[string]interface{}类型,以便更灵活地处理数据。虽然使用结构体通常更高效,但在某些场景下,动态地将数据映射到Map中可能更为方便。本文将介绍如何使用标准库以及第三方库sqlx来实现这一目标,并探讨各自的优缺点。 在G…

    2025年12月16日
    000
  • Go语言中策略模式的实践:利用接口实现灵活的行为切换

    本文深入探讨了go语言中策略模式的实现方法,强调了go语言通过接口实现行为封装和可替换性的核心理念。我们将学习如何定义策略接口、实现具体的策略,并通过嵌入结构体或方法参数传递两种方式将策略集成到上下文结构中,从而灵活地处理不同数据格式或业务逻辑,提升代码的可扩展性和维护性。 在Go语言中,我们通常不…

    2025年12月16日
    000
  • Golang JSON 反序列化 Python 字符串的正确姿势

    本文旨在解决 Golang 在处理来自 Python 消息队列(如 AWS SQS)的数据时,遇到的 JSON 反序列化问题。由于 Python 字符串类型差异,直接使用 Golang 反序列化可能会失败。本文将介绍如何利用 Python 的 `json` 库生成有效的 JSON 字符串,从而避免 …

    2025年12月16日
    000
  • Golang XML Unmarshal 失败问题排查与解决方案

    本文旨在帮助开发者解决 Golang 中 XML 反序列化失败的问题。通过分析 XML 结构和 Golang 结构体定义,找出导致Unmarshal失败的常见原因,并提供相应的解决方案,确保XML数据能正确地映射到Go结构体中。本文将通过一个实际示例,详细讲解如何避免这类问题,并提供可运行的代码示例…

    2025年12月16日
    000
  • 将文件嵌入 Go 二进制文件的实用指南

    本文介绍了两种将文件嵌入 Go 二进制文件的方法,以便在发布程序时无需额外提供文件。针对 Go 1.16 及更高版本,推荐使用 go:embed 指令,它提供了一种简洁高效的方式来嵌入单个或多个文件。对于更早的 Go 版本或需要更灵活的嵌入方式,可以使用 go generate 命令配合自定义脚本来…

    2025年12月16日
    000
  • 编程语言中操作符与函数的异同解析

    #%#$#%@%@%$#%$#%#%#$%@_3bf8a523aea21a3a0f6c++53b0f43429bb中操作符与函数的界定并非一成不变,而是高度依赖于语言设计。c语言中的操作符是内置且行为固定的,而c++允许通过函数重载来扩展或改变操作符的行为。go语言则明确将`new`视为普通函数而非…

    2025年12月16日
    000
  • Go语言中自定义Byte类型切片与标准Byte切片之间的转换

    本文旨在解决Go语言中自定义byte类型切片(如[]myByte)与标准byte切片([]byte)之间的转换问题。由于Go的类型系统限制,直接转换通常不可行。本文将介绍一种通过自定义切片类型实现类型安全转换的方法,并提供示例代码,帮助开发者在需要区分不同类型字节的场景下,高效地处理字节切片。 在G…

    2025年12月16日
    000
  • Go中将JSON反序列化为接口的正确方法

    本文档旨在指导开发者如何在Go语言中将JSON数据反序列化到接口类型。通过定义包装器接口和实现解包方法,我们可以灵活地处理不同结构的JSON响应,并将其转换为相应的Go结构体。本文将详细介绍实现步骤,并提供示例代码,帮助你理解并解决反序列化过程中可能遇到的问题。 问题分析 在Go语言中使用 json…

    2025年12月16日
    000
  • 编程语言中的操作符与函数:深入理解其差异与语言特异性

    本文深入探讨了#%#$#%@%@%$#%$#%#%#$%@_3bf8a523aea21a3a0f6c++53b0f43429bb中操作符与函数的本质区别及其在不同语言中的表现。通过对比c、c++、haskell等语言对操作符的处理方式,以及go语言中`new`关键字作为函数的特殊案例,揭示了理解这些…

    2025年12月16日
    000
  • Go语言中自定义Byte类型切片与[]byte的转换

    本文旨在解决Go语言中自定义`byte`类型切片与内置`[]byte`类型之间的转换问题。通过定义新的切片类型并结合类型转换,我们可以在保证类型安全的前提下,实现自定义`byte`切片与`[]byte`之间的灵活转换,从而满足特定场景下的需求。 在Go语言中,我们有时会出于逻辑区分的目的,定义自己的…

    2025年12月16日
    000

发表回复

登录后才能评论
关注微信