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进行监管
相关文章:
runit-docker中管理多个服务
runit-docker中管理多个服务 介绍Runit, systemctl和supervisor是三种不同的服务管理工具区别runit优点程序构成快速开始runit实现服务退出执行指定操作runit监管服务打印日志到syslogrunit监管服务后台运行runit监管服务一些错误总结 介绍 runit 是一个轻量级的、稳定的、跨平…...

Intune 应用程序管理
由于云服务提供了增强的安全性、稳定性和灵活性,越来越多的组织正在采用基于云的解决方案来满足他们的需求。这正是提出Microsoft Endpoint Manager等解决方案的原因,它结合了SCCM和Microsoft Intune,以满足本地和基于云的端点管理。 与 Int…...

Oracle DB 安全性 : TDE HSM TCPS Wallet Imperva
• 配置口令文件以使用区分大小写的口令 • 对表空间进行加密 • 配置对网络服务的细粒度访问 TCPS 安全口令支持 Oracle Database 11g中的口令: • 区分大小写 • 包含更多的字符 • 使用更安全的散列算法 • 在散列算法中使用salt 用户名仍是Oracle 标识…...

leetcode27—移除元素
思路: 参考26题目双指针的思想,只不过这道题不是快慢指针。 看到示例里面数组是无序的,也就是说后面的元素也是可能跟给定 val值相等的,那么怎么处理呢。就想到了从前往后遍历,如果left对应的元素 val时,…...
flask---》更多查询方式/连表查询/原生sql(django-orm如何执行原生sql)/flask-sqlalchemy
更多查询方式 #1 查询: filer:写条件 filter_by:等于的值 # 查询所有 是list对象 res session.query(User).all() # 是个普通列表 print(type(res)) print(len(res))# 2 只查询某几个字段 # select name as xx,email from user; res session.…...
Chromium内核浏览器编译记(三)116版本内核UI定制
转载请注明出处:https://blog.csdn.net/kong_gu_you_lan/article/details/132180843?spm1001.2014.3001.5501 本文出自 容华谢后的博客 往期回顾: Chromium内核浏览器编译记(一)踩坑实录 Chromium内核浏览器编译记(…...

LoRaWan网关设计架构介绍
LoRa 数据包转发器是在基于 LoRa 的网关(带或不带 GPS)主机上运行的程序。它将集中器(上行链路)接收到的 RF 数据包通过安全的 IP 链路转发到LoRaWAN 网络服务器( LNS )。它还通过相同的安全 IP 将 LNS(下行链路)发送的 RF 数据包传输到一台或多台设备。此外,它还可以传…...
vue 全局状态管理(简单的store模式、使用Pinia)
目录 为什么使用状态管理简单的store模式服务器渲染(SSR) pinia简介示例1. 定义一个index.ts文件2. 在main.ts中引入3. 定义4. 使用 为什么使用状态管理 多个组件可能会依赖同一个状态时,我们有必要抽取出组件内的共同状态集中统一管理&…...

ORACLE和MYSQL区别
1,Oracle没有offet,limit,在mysql中我们用它们来控制显示的行数,最多的是分页了。oracle要分页的话,要换成rownum。 2,oracle建表时,没有auto_increment,所有要想让表的一个字段自增,…...

tensorflow 1.14 的 demo 02 —— tensorboard 远程访问
tensorflow 1.14.0, 提供远程访问 tensorboard 服务的方法 第一步生成 events 文件: 在上一篇demo的基础上加了一句,如下, tf.summary.FileWriter("./tmp/summary", graphsess1.graph) hello_tensorboard_remote.py …...
Spring中Bean的循环依赖问题
1.什么是Bean的循环依赖? 简单来说就是在A类中,初始化A时需要用到B对象,而在B类中,初始化B时需要用到A对象,这种状况下在Spring中,如果A和B同时初始化,A,B同时都需要对方的资源&…...

若依管理系统后端将 Mybatis 升级为 Mybatis-Plus
文章目录 说明流程增加依赖修改配置文件注释掉MybatisConfig里面的Bean 代码生成使用IDEA生成代码注意 Controller文件 说明 若依管理系统是一个非常完善的管理系统模板,里面含有代码生成的方法,可以帮助用户快速进行开发,但是项目使用的是m…...

剪切、复制、粘贴事件
剪切、复制、粘贴事件 oncopy 事件在用户拷贝元素上的内容时触发。onbeforecut 事件在用户剪切文本,且文本还未删除时触发触发。oncut 事件在用户剪切元素的内容时触发。onbeforepaste 事件在用户向元素中粘贴文本之前触发。onpaste 事件在用户向元素中粘贴文本时触…...

Redis储存结构
Redis怎么储存的 这个redisDb是数据库对象 里面的其他字段忽略了 然后里面有个dict列表(字典列表) 我们随便来看一个redisObject 区分一下子啊 他这个dict里面没有存redisObject的对象 也没有存dict对象 它只是存了个数据指针 你看那个redis每个底层编码 抠搜的 这块要是再保存…...

使用logback异步打印日志
文章目录 一、介绍二、运行环境三、演示项目1. 接口2. 日志配置文件3. 效果演示4. 异步输出验证 四、异步输出原理五、其他参数配置六、源码分析1. 同步输出2. 异步输出 七、总结 一、介绍 对于每一个开发人员来说,在业务代码中添加日志是至关重要的,尤…...

ArcGIS Pro暨基础入门、制图、空间分析、影像分析、三维建模、空间统计分析与建模、python融合、案例应用
GIS是利用电子计算机及其外部设备,采集、存储、分析和描述整个或部分地球表面与空间信息系统。简单地讲,它是在一定的地域内,将地理空间信息和 一些与该地域地理信息相关的属性信息结合起来,达到对地理和属性信息的综合管理。GIS的…...

Rabbitmq的消息确认
配置文件 spring:rabbitmq:publisher-confirm-type: correlated #开启确认回调publisher-returns: true #开启返回回调listener:simple:acknowledge-mode: manual #设置手动接受消息消息从生产者到交换机 无论消息是否到交换机ConfirmCallback都会触发。 Resourceprivate Rabb…...

在飞机设计中的仿真技术
仿真技术在飞机设计中发挥着越来越重要的作用,本文阐述了国内外在飞机设计中广泛使用的结构强度计算,多体动力学仿真、多学科多目标结构优化、内外流场分析、非线性有限元分析、疲劳强度分析、电磁仿真分析,机电液联合仿真分析等,…...

(2023Arxiv)Meta-Transformer: A Unified Framework for Multimodal Learning
论文链接:https://arxiv.org/abs/2307.10802 代码链接:https://github.com/invictus717/MetaTransformer 项目主页:https://kxgong.github.io/meta_transformer/ 【注】:根据实验结果来看,每次输入一种数据源进行处…...
解决Python读取图片路径存在转义字符
普遍解决路径中存在转义字符的问题的方法 普遍解决转义字符的问题,无非是以下这三种。 一、在路径前添加r 直接在路径前面加r,这种方法能够使字符保持原始的意思。 比如下面这种: pathr"D:\MindSpore\Dearui\source\ces\0AI.png&qu…...

linux之kylin系统nginx的安装
一、nginx的作用 1.可做高性能的web服务器 直接处理静态资源(HTML/CSS/图片等),响应速度远超传统服务器类似apache支持高并发连接 2.反向代理服务器 隐藏后端服务器IP地址,提高安全性 3.负载均衡服务器 支持多种策略分发流量…...
React hook之useRef
React useRef 详解 useRef 是 React 提供的一个 Hook,用于在函数组件中创建可变的引用对象。它在 React 开发中有多种重要用途,下面我将全面详细地介绍它的特性和用法。 基本概念 1. 创建 ref const refContainer useRef(initialValue);initialValu…...
HTML前端开发:JavaScript 常用事件详解
作为前端开发的核心,JavaScript 事件是用户与网页交互的基础。以下是常见事件的详细说明和用法示例: 1. onclick - 点击事件 当元素被单击时触发(左键点击) button.onclick function() {alert("按钮被点击了!&…...

SpringCloudGateway 自定义局部过滤器
场景: 将所有请求转化为同一路径请求(方便穿网配置)在请求头内标识原来路径,然后在将请求分发给不同服务 AllToOneGatewayFilterFactory import lombok.Getter; import lombok.Setter; import lombok.extern.slf4j.Slf4j; impor…...

如何理解 IP 数据报中的 TTL?
目录 前言理解 前言 面试灵魂一问:说说对 IP 数据报中 TTL 的理解?我们都知道,IP 数据报由首部和数据两部分组成,首部又分为两部分:固定部分和可变部分,共占 20 字节,而即将讨论的 TTL 就位于首…...
鸿蒙DevEco Studio HarmonyOS 5跑酷小游戏实现指南
1. 项目概述 本跑酷小游戏基于鸿蒙HarmonyOS 5开发,使用DevEco Studio作为开发工具,采用Java语言实现,包含角色控制、障碍物生成和分数计算系统。 2. 项目结构 /src/main/java/com/example/runner/├── MainAbilitySlice.java // 主界…...
2023赣州旅游投资集团
单选题 1.“不登高山,不知天之高也;不临深溪,不知地之厚也。”这句话说明_____。 A、人的意识具有创造性 B、人的认识是独立于实践之外的 C、实践在认识过程中具有决定作用 D、人的一切知识都是从直接经验中获得的 参考答案: C 本题解…...
Typeerror: cannot read properties of undefined (reading ‘XXX‘)
最近需要在离线机器上运行软件,所以得把软件用docker打包起来,大部分功能都没问题,出了一个奇怪的事情。同样的代码,在本机上用vscode可以运行起来,但是打包之后在docker里出现了问题。使用的是dialog组件,…...
rnn判断string中第一次出现a的下标
# coding:utf8 import torch import torch.nn as nn import numpy as np import random import json""" 基于pytorch的网络编写 实现一个RNN网络完成多分类任务 判断字符 a 第一次出现在字符串中的位置 """class TorchModel(nn.Module):def __in…...
在QWebEngineView上实现鼠标、触摸等事件捕获的解决方案
这个问题我看其他博主也写了,要么要会员、要么写的乱七八糟。这里我整理一下,把问题说清楚并且给出代码,拿去用就行,照着葫芦画瓢。 问题 在继承QWebEngineView后,重写mousePressEvent或event函数无法捕获鼠标按下事…...