runit-docker中管理多个服务

runit-docker中管理多个服务

  • 介绍
    • Runit, systemctl和supervisor是三种不同的服务管理工具区别
    • runit优点
    • 程序构成
    • 快速开始
    • runit实现服务退出执行指定操作
    • runit监管服务打印日志到syslog
    • runit监管服务后台运行
    • runit监管服务一些错误总结

介绍

runit 是一个轻量级的、稳定的、跨平台的服务管理器。它由 Bruce Guenter 开发,目前由 Laurent Bercot 维护。runit 的设计简单明了,易于使用和扩展,非常适合用于运行服务的守护进程。

runit 提供了一种简单的方式来管理系统服务。与传统的 init 系统不同,runit 不使用脚本文件或者其他复杂的配置来管理服务,而是直接操作系统的进程表,以及通过一个指定的目录来管理服务的运行状态。

runit 将所有服务都视为独立的进程,它们可以通过 shell 脚本或者其他语言来启动。当服务启动时,runit 将会监视它的运行状态,并在服务崩溃或退出时重新启动它。

在 ruanit 中,每个服务都由一个单独的目录表示。该目录包含了所有服务所需的信息,例如启动脚本、环境变量等。runit 非常灵活,可以根据需要添加或删除服务,修改配置文件等。

官方文档:http://smarden.org/runit/

Runit, systemctl和supervisor是三种不同的服务管理工具区别

Runit:
Runit是一种轻量级的、跨平台的服务管理工具,用于管理和监控系统服务。它采用简单的文件夹结构和脚本,以监视、启动、停止和重启服务。Runit专注于可靠性和高效性,并支持服务间的依赖关系。每个服务都由一个独立的runit服务目录表示,其中包含run脚本用于启动服务。Runit不依赖于Linux特有的系统功能,因此也可以在其他UNIX系统上运行。

Systemd:
Systemd是Linux系统中最常见的服务管理工具,用于管理守护进程和系统服务。它是现代Linux系统的默认初始化系统,具有强大的功能和广泛的支持。Systemd使用单一的配置文件(.service文件)来定义和管理服务。它可以并行启动多个服务,支持服务依赖关系,并提供更多高级特性,如socket激活、资源限制等。Systemd也可以管理和监控它所启动的进程。

Supervisor:
Supervisor是一个进程管理工具,主要用于管理守护进程或后台任务。它不同于systemd和runit,它不是一个完整的初始化系统,而是专注于管理单个进程。Supervisor允许你定义和监控多个进程,并提供一种简单的方式来启动、停止、重启进程,并在进程意外退出时自动重新启动。

总结:

  • Runit是一个轻量级的、跨平台的服务管理工具,适用于管理系统服务和服务间的依赖关系。
  • Systemd是Linux系统的默认初始化系统,支持并行启动和管理多个服务,提供更多高级特性。
  • Supervisor是一个进程管理工具,用于管理守护进程或后台任务,而不是一个完整的初始化系统。

选择哪种工具取决于特定的需求和系统环境。

  • 对于Linux系统,通常使用默认的systemd;
  • 对于跨平台需求或简单的服务管理,例如容器中多个服务的监管,可以考虑使用runit。
  • Supervisor通常用于管理单个后台进程或守护进程。

runit优点

  • 易于配置和使用:runit 的配置简单明了,使用起来非常容易。它采用纯文本配置文件,不需要复杂的脚本或配置语言,使得用户可以快速理解和定义服务的启动和监控规则。

  • 快速启动和低资源消耗:runit 启动速度非常快,因为它仅关注服务的启动和管理,没有其他冗余功能。此外,runit 的内存和CPU消耗非常低,适合在资源受限的环境中运行。

  • 可靠性和稳定性:runit 以稳定性著称,它经过多年的发展和广泛应用,被广泛认可为一个可靠的服务监控工具。它采用简洁的设计和模块化架构,有助于降低故障风险。

  • 支持并行启动:runit 支持并行启动多个服务,这意味着可以在系统启动时同时启动多个服务,提高了系统启动速度。

  • 适用于各种系统:runit 可以运行在多种操作系统上,包括各种Linux发行版、FreeBSD等,这使得它成为一个跨平台的选择。

  • 容错和健壮性:runit 具有容错机制,能够处理服务异常退出和重启,并且可以在服务崩溃时采取自动恢复措施。

程序构成

  • runsvdir:每 5 秒扫描一次目录。如果有新的子目录,它会自动创建一个 runsv 进程来维护 service。
  • runsv:用于管理 service 的 daemon 进程,可以通过 sv 命令来操作 service。
  • sv:用户操作 service 用的 CLI 工具。
  • svlogd:用于收集 service 日志的 daemon 进程。每个 service 都会启动一个 svlogd 进程。

快速开始

服务监控:监控程序的二进制文件

conf/runit-sv/php-fpm/run

#!/bin/bash
exec /usr/sbin/php-fpm8.2 --fpm-config /etc/php/8.2/fpm/php-fpm.conf -R

conf/runit-sv/nginx/run

#!/bin/bash
exec /usr/sbin/nginx

Dockerfile

FROM ubuntu:18.04RUN apt-get install -y runit \&&  mkdir -p /etc/service/nginx/  /etc/sv/nginx/ /etc/sv/php-fpm/COPY conf/runit-sv/nginx/run /etc/service/nginx/run
RUN chmod 755  /etc/service/nginx/runCOPY conf/runit-sv/php-fpm/run /etc/service/php-fpm/run
RUN chmod 755  /etc/service/php-fpm/runRUN  chmod 755  /etc/sv/nginx/run \&& chmod 755  /etc/sv/php-fpm/run \&& ln -s /etc/sv/charon /etc/service/  \&& ln -s /etc/sv/php-fpm/ /etc/service/  \&& ln -s /etc/sv/nginx/ /etc/service/# 启动GAD
CMD ["/bin/docker-entrypoint.sh"]

/bin/docker-entrypoint.sh

exec runsvdir /etc/service &

runit实现服务退出执行指定操作

runit使用 trap 命令来捕获 TERM 和 INT 信号,当使用 runit 自身会接收到 TERM 信号时停止服务,有时会不生效,可以使用自定义捕获 TERM 和 INT 信号

#!/bin/bashstop_task() {killall nginxexit 0}trap stop_task TERM INT/bin/sh -c 'trap stop_task TERM INT; /usr/sbin/nginx 2>&1 | /usr/bin/logger -n 127.0.0.1 -P 514 -t NGINX -d --rfc5424 '  &wait $!

runit监管服务打印日志到syslog

#!/bin/bash
exec /usr/sbin/nginx  | /usr/bin/logger -n 127.0.0.1 -P 514 -t NGINX -d --rfc5424   2>&1

runit监管服务后台运行

在runit中,run脚本是一个阻塞式的命令,直到服务退出才会退出脚本。如果您、需要在服务启动后执行其他任务,可以尝试以下几种方法:在run脚本中使用后台进程来启动服务

方式一:在run脚本中使用&符号来将服务启动命令放到后台进程中执行。

例如:


#!/bin/sh# Start the service in the background
/usr/bin/my-service &

这样启动的服务会在后台运行,而不会阻塞脚本,这样您就可以在脚本中执行其他任务了。

方式二:在run脚本中使用nohup命令
nohup命令可以将命令放到后台进程中执行,并将输出重定向到指定文件中。例如:

#!/bin/sh# Start the service in the background with nohup
nohup /usr/bin/my-service > /var/log/my-service.log 2>&1 &# Other tasks to execute after the service starts
echo "My service has started."

方式三:在run脚本中使用wait命令

wait命令可以等待指定的进程结束,并在进程结束后继续执行脚本中的其他命令。例如:

#!/bin/sh# Start the service and wait for it to finish
/usr/bin/my-service &
wait $!# Other tasks to execute after the service finishes
echo "My service has finished."

在这个例子中,wait命令会等待my-service进程结束,并返回my-service的退出状态码。在my-service进程结束后,脚本会继续执行其他命令。

runit监管服务一些错误总结

注意:通过apt-get安装的 文件,需要手动关闭他的daemon,不然会通过sysinit进行托管,在

daemon

php-fpm 进程默认是以 daemon 方式启动的,使用 runit 监护进程时,被监护的进程不能是守护进程。
我们需要关闭 php-fpm 的进程守护,编辑 /usr/local/php/etc/php-fpm.conf,查找 daemonize 修改为 no。

继续锁定 ERROR,先查看 php-fpm 日志:

[01-Sep-2018 11:20:21] ERROR: unable to bind listening socket for address '127.0.0.1:9000': Address already in use (98)
[01-Sep-2018 11:20:21] ERROR: FPM initialization failed
[01-Sep-2018 11:20:23] ERROR: unable to bind listening socket for address '127.0.0.1:9000': Address already in use (98)
[01-Sep-2018 11:20:23] ERROR: FPM initialization failed
[01-Sep-2018 11:20:24] ERROR: unable to bind listening socket for address '127.0.0.1:9000': Address already in use (98)
[01-Sep-2018 11:20:24] ERROR: FPM initialization failed
[01-Sep-2018 11:20:25] ERROR: unable to bind listening socket for address '127.0.0.1:9000': Address already in use (98)
[01-Sep-2018 11:20:25] ERROR: FPM initialization failed

所以在runit监管服务时,如果有类似在通过apt-get安装以后,默认使用susinit监管程序,需要把服务的默认启动方式关了,将其二进制通过runit进行监管

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/29133.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【error 踩坑】AttributeError: ‘DataFrame‘ object has no attribute ‘iteritems‘

新建了虚拟环境py38,安装pandas pip install pandas接着使用spark向hive表中写数据 发现出现了error: AttributeError: DataFrame object has no attribute iteritemsgoogle后找到答案: Looks like iteritems was removed in pandas 2.0 - try using pandas versi…

Golang交叉编译

Golang交叉编译主要依赖几个参数:GOOS、GOARCH和CGO_ENABLED。 参数作用GOOS交叉编译的OSGOARCH交叉编译的CPU架构CGO_ENABLED设置为0时,编译出的二进制是静态的,也就是说没有外部的依赖。 编译在arm64的linux环境运行的程序: …

econml双机器学习实现连续干预和预测

连续干预 在这个示例中,我们使用LinearDML模型,使用随机森林回归模型来估计因果效应。我们首先模拟数据,然后模型,并使用方法来effect创建不同干预值下的效应(Conditional Average Treatment Effect,CATE&…

【深度学习MOT videos detect】Detect to Track and Track to Detect

论文:https://arxiv.org/abs/1710.03958 代码:https://github.com/feichtenhofer/Detect-Track 文章目录 Abstract1. Introduction2. Related work后面翻译略 Abstract 近期用于在视频中高精度检测和跟踪目标类别的方法越来越复杂,每年都变得…

【Express.js】使用zod检验

使用zod检验 上一节我们介绍了 express-validator,本节我们介绍一个更通用的检验工具 Zod What’s Zod.js? 写前端的同学可能知道Zod,我们在提交表单前需要对数据初步检查,Zod是一个很棒的工具。前端可以偷懒,但后端不能偷懒&…

Camunda 7.x 系列【10】使用 Java API 运行流程实例

有道无术,术尚可求,有术无道,止于术。 本系列Spring Boot 版本 2.7.9 本系列Camunda 版本 7.19.0 源码地址:https://gitee.com/pearl-organization/camunda-study-demo 文章目录 1. 前言2. 运行流程实例2.1 查询流程定义2.2 启动流程2.3 任务查询2.4 审批3. 数据表1. 前言…

vue3—SCSS的安装、配置与使用

SCSS 安装 使用npm安装scss: npm install sass sass-loader --save-dev 配置 配置到全局 🌟附赠代码🌟 css: {preprocessorOptions: {scss: {additionalData:import "./src/Function/Easy_I_Function/Echarts/ToSeeEcharts/utill.…

Spring Boot Admin 环境搭建与基本使用

Spring Boot Admin 环境搭建与基本使用 一、Spring Boot Admin是什么二、提供了那些功能三、 使用Spring Boot Admin3.1搭建Spring Boot Admin服务pom文件yml配置文件启动类启动admin服务效果 3.2 common-apipom文件feignhystrix 3.3服务消费者pom文件yml配置文件启动类control…

前端面试的性能优化部分(6)每天10个小知识点

目录 系列文章目录前端面试的性能优化部分(1)每天10个小知识点前端面试的性能优化部分(2)每天10个小知识点前端面试的性能优化部分(3)每天10个小知识点前端面试的性能优化部分(4)每天…

Simulation 线性静力分析流程

有限元仿真分析软件有很多,但是分析的流程却是大同小异,今天给大家分享的是Simulation的线性静力分析流程。 1.构思分析方案。 确定研究对象,研究的方法、验证方案等等。听起来比较空洞,实践过程中我建议首先需要把目标和有限元分…

HDFS中的Trash垃圾桶回收机制

Trash垃圾桶回收机制 文件系统垃圾桶背景功能概述Trash Checkpoint Trash功能开启关闭HDFS集群修改core-site.xml删除文件到trash删除文件跳过从trash中恢复文件清空trash 文件系统垃圾桶背景 回收站(垃圾桶)是windows操作系统里的一个系统文件夹&#…

C++学习笔记总结练习:并发编程与多线程

并发编程与多线程 1. 基础知识 C多线程 线程:线程是操作系统能够进行CPU调度的最小单位,它被包含在进程之中,一个进程可包含单个或者多个线程。可以用多个线程去完成一个任务,也可以用多个进程去完成一个任务,它们的…

一起学SF框架系列7.1-spring-AOP-基础知识

AOP(Aspect-oriented Programming-面向切面编程)是一种编程模式,是对OOP(Object-oriented Programming-面向对象编程)一种有益补充。在OOP中,万事万物都是独立的对象,对象相互耦合关系是基于业务进行的;但在…

python获取类名__qualname__,解决django接口ObjectDoesNotExist异常寻找model的问题

在django项目中,经常使用类似Model.objects.get(id1)的方法取对象,默认抛出的异常是ObjectDoesNotExist类型,通过try catch可以把异常捕获,获取的异常是Model.DoesNotExist类型, 要获知其类名,可以使用__na…

目标识别模型两种部署形态图

目标检测预训练模型基于新数据进行微调(训练)之后,得到一个权重文件。 在日常工业、车载等需求环境下,需要在嵌入式移动端的软件系统中调用该模型文件进行推断测试,软件系统追求性能经常使用C/C进行编码实现&#xff…

第十一次CCF计算机软件能力认证

第一题:打酱油 小明带着 N 元钱去买酱油。 酱油 10 块钱一瓶,商家进行促销,每买 3 瓶送 1 瓶,或者每买 5 瓶送 2 瓶。 请问小明最多可以得到多少瓶酱油。 输入格式 输入的第一行包含一个整数 N,表示小明可用于买酱油的…

聚合在Elasticsearch中的使用及示例验证

聚合在Elasticsearch中的使用 系统中使用的ES环境不一定每篇文章都有,但是可以在合集中找到,关注《醉鱼Java》一起进步 环境 elasticsearch 8.1 搭建 version: 3.8 services:cerebro:image: lmenezes/cerebro:0.8.3container_name: cerebroports:- "…

【深度学习】【风格迁移】Visual Concept Translator,一般图像到图像的翻译与一次性图像引导,论文

General Image-to-Image Translation with One-Shot Image Guidance 论文:https://arxiv.org/abs/2307.14352 代码:https://github.com/crystalneuro/visual-concept-translator 文章目录 Abstract1. Introduction2. 相关工作2.1 图像到图像转换2.2. Di…

一键登录和短信验证登录,到底有什么区别?

一键登录是什么? 本机号码一键登录验证是一种登录认证方式,通过获取用户手机上的本机号码来验证用户身份,从而实现快捷登录和简化登录流程的目的。 在使用一键登录时,首先需要用户在登录页面选择使用本机号码一键登录&#xff0…

ROS学习笔记之——路径规划及avoid obstacles

之前博客《ROS学习笔记之——Navigation Stack及路径规划》介绍了navigation stack,其中涉及到的amcl、路径规划以及避障还没有详细的展开 目录 AMCL 路径规划 全局路径规划中的地图 栅格地图(Grid Map) 概率图(Cost Map) 特征地图(Feature Map) 拓扑地图(Topo…