runit 学习笔记
概要
通过这篇教程,我们可以快速了解runit并搭建起相应服务。
runit是一个用于服务监控的UNIX软件,它提供以下两种服务:
当服务器启动的时候启动定义好的服务。
监控运行的服务,当服务发生意外中断的时候,自动重启服务。
这篇教程将通过一个简单的示例来讲解如何创建新的runit服务。如果你想了解更多信息,可以查看runit的官方文档。
本笔记包括以下三部分:
- 创建一个runit模板
- 创建第一个服务
- 如何自动管理服务
搭建环境
首先确保系统安装了runit,大多数Linux版本的软件仓库里都包哈了runit包。例如,如果你的系统是基于Debian的,则可以使用下面的命令进行安装:
apt-get install runit
如果是centos,则可以使用yum进行安装,但是默认情况下centos软件仓库里并没有runit,所以需要先配置相应的仓库:
curl -s https://packagecloud.io/install/repositories/imeyer/runit/script.rpm.sh | sudo bash
sudo yum install runit-2.1.1-7.el7.centos.x86_64
装完之后执行以下命令,它的意思是runsvdir会监控/etc/service/目录下的文件,这些文件用于配置被监控的服务
runsvdir -P /etc/service log:.......
runsvdir其实是一套组件,这些组件可以满足用户的各种需求,核心组件包括了runsvdir,runsv, chpst,svlogd以及sv。
注意输出结果中的runsvdir -P /etc/service log:.......
, 它的意思是runsvdir会监控/etc/service/
目录下的文件,这些文件用于配置被监控的服务。
被监控的服务是通过在/etc/service
目录下创建子目录,并添加可执行脚本run
来实现的。
当runsvdir发现新的配置文件时,它就会自动启动一个runsv进程来管理这个配置的服务。
runit的设计思想就是每个组件的功能是完全独立的,以便管理。可以使用man命令查看具体组件的
man runsvdir
在/etc/service,如果不存在,则使用mkdir创建相应目录
mkdir /etc/service
验证启动是否成功
[root@fabric-cli logs]# ps -ef | grep runsvdir
root 2023 1915 0 16:27 pts/1 00:00:00 runsvdir -P /etc/service
root 2638 1519 0 16:37 pts/0 00:00:00 grep --color=auto runsvdir
创建模板
为了便于开发与测试,这里我们不直接在/etc/service/
目录中添加配置文件,而是创建一个暂存的目录来放置配置文件。
当我们满意自己的测试之后,再使用软链接,将暂存目录链接到/etc/service
。
创建/etc/runit
作为暂存目录。
mkdir /etc/runit
在创建一个真正的runit服务之前,我们先创建一个模板。这个模板将展示runit的基本用法,以后可以直接使用这个模板创建新的服务。
首先创建template目录:
mkdir /etc/runit/template
接下来,创建run脚本:
#!/bin/sh -e
exec 2>&1
exec chpst -u USER COMMAND
给run添加可执行权限:
chmod +x /etc/runit/template/run
这个脚本首先将标准错误输出流输出到标准输出流,然后执行chpst命令。chpst命令用来指定使用哪个用户执行命令。由于run脚本默认被root用户执行,通过chpst可以将run配置为普通用户来执行。通过man命令可以查看chpst的更多信息。
man chpst
当runsvdir检查到/etc/service目录下包含一个新的目录时,runsvdir会启动一个runsv进程来执行和监控run脚本。通过man命令查看runsv的更多信息:
man runsv
你可能注意runsv还可以监控日志服务,日志在应用中非常的重要。下面创建一个日志模板。
首先创建log目录:
mkdir /etc/runit/template/log
然后创建run脚本:
#!/bin/sh
exec chpst -u USER svlogd -tt LOGDIR
给run脚本添加可执行权限:
# chmod +x /etc/runit/template/log/run
上面的脚本使用chpst启动一个svlogd
守护进程,该进程将日志信息写到LOGDIR目录中。
使用man命令获取更多关于svlodg的信息:
man svlogd
当runsvdir在/etc/service/目录中发现新的配置时,它会继续查找子目录log,如果找到了则启动runsv进程来执行和监控log目录下的run脚本。
服务示例
接下来,我们使用上面创建的模板来创建一个简单的服务配置。首先创建需要再run脚本中被chpst使用的用户:
adduser foo
接下来创建放置服务配置的目录,并将它的所属用户与用户组设置为foo。
mkdir /opt/example
chown foo:foo /opt/example
接下来切换到foo用户:
su foo
在/opt/example目录中添加脚本foo-service.sh:
#!/bin/bash
echo "Started service..."for i in {1..30}
doecho "Doing stuff..."sleep 1
doneecho "Oh no I crashed..." >&2
exit 1
给脚本赋予执行权限:
chmod +x /opt/example/foo-service.sh
上面的脚本模拟了一个真实的应用,每隔1秒打印一次日志信息,最后打印一次错误信息。可以尝试执行这个脚本:
/opt/example/foo-service.sh
接下来创建包含日志服务的目录:
mkdir /opt/example/logs
再切换回root用户。
exit
接下来使用之前创建的模板来监控这个示例服务,将暂存目录中的模板文件拷贝至新的目录example:
cp -R /etc/runit/template /etc/runit/example
更新/etc/runit/example/run脚本的内容,使用foo用户来执行foo-service.sh脚本。
#!/bin/sh -e
exec 2>&1
exec chpst -u foo /opt/example/foo-service.sh
同样的,更新/etc/runit/example/log/run脚本内容:
#!/bin/sh
exec chpst -u foo svlogd -tt /opt/example/logs
在将服务部署到/etc/service前,首先测试下配置是否正确:
/etc/runit/example/run
如果脚本运行正常,就可以部署服务了,创建一个软链接:
ln -s /etc/runit/example /etc/service/example
不出意外的话,runsvdir会检测到我们配置的两个服务,然后启动两个runsv进程来执行并监控服务。通过下面的命令可以检测服务是否正常运行。
sv status example
输出结果如下所示:
[root@fabric-cli logs]# sv status example
run: example: (pid 3325) 2s; run: log: (pid 2025) 1248s
使用tail命令可以查看日志信息:
[root@fabric-cli logs]# tail -f /opt/example/logs/current
2018-05-23_08:49:10.80197 Doing stuff...
2018-05-23_08:49:11.80376 Doing stuff...
2018-05-23_08:49:12.80574 Doing stuff...
2018-05-23_08:49:13.80805 Doing stuff...
2018-05-23_08:49:14.80964 Doing stuff...
2018-05-23_08:49:15.81138 Doing stuff...
...
管理服务
最后,我们再来学习下sv用法,sv用来手动管理我们的服务。
检查服务的状态
sv status example
停止服务
sv stop example
停止服务之后不会再输出日志信息,也不会再自动重启。
重启服务
sv restart example
更多用法
man sv
参考
runit 快速入门
runit 学习笔记相关推荐
- 前端面试+学习笔记(HTML+CSS+JavaScript+ES6+Vue+NodeJs)
前端面试+学习笔记(HTML+CSS+JavaScript+ES6+Vue+NodeJs) 一. HTML 1. 盒子模型 是什么:每个元素被表示为一个矩形的盒子,有四个部分组成:内容(content ...
- 36.Oracle深度学习笔记——SLOB 工具使用
36.Oracle深度学习笔记--SLOB 工具使用 欢迎转载,转载请标明出处:http://blog.csdn.net/notbaron/article/details/50859152 SLOB全 ...
- 36 Oracle深度学习笔记 SLOB 工具使用
分享一下我老师大神的人工智能教程!零基础,通俗易懂!http://blog.csdn.net/jiangjunshow 也欢迎大家转载本篇文章.分享知识,造福人民,实现我们中华民族伟大复兴! 36.O ...
- PyTorch 学习笔记(六):PyTorch hook 和关于 PyTorch backward 过程的理解 call
您的位置 首页 PyTorch 学习笔记系列 PyTorch 学习笔记(六):PyTorch hook 和关于 PyTorch backward 过程的理解 发布: 2017年8月4日 7,195阅读 ...
- 容器云原生DevOps学习笔记——第三期:从零搭建CI/CD系统标准化交付流程
暑期实习期间,所在的技术中台-效能研发团队规划设计并结合公司开源协同实现符合DevOps理念的研发工具平台,实现研发过程自动化.标准化: 实习期间对DevOps的理解一直懵懵懂懂,最近观看了阿里专家带 ...
- 容器云原生DevOps学习笔记——第二期:如何快速高质量的应用容器化迁移
暑期实习期间,所在的技术中台-效能研发团队规划设计并结合公司开源协同实现符合DevOps理念的研发工具平台,实现研发过程自动化.标准化: 实习期间对DevOps的理解一直懵懵懂懂,最近观看了阿里专家带 ...
- 2020年Yann Lecun深度学习笔记(下)
2020年Yann Lecun深度学习笔记(下)
- 2020年Yann Lecun深度学习笔记(上)
2020年Yann Lecun深度学习笔记(上)
- 知识图谱学习笔记(1)
知识图谱学习笔记第一部分,包含RDF介绍,以及Jena RDF API使用 知识图谱的基石:RDF RDF(Resource Description Framework),即资源描述框架,其本质是一个 ...
最新文章
- Open3d学习计划—高级篇 4(多视角点云配准)
- 数据中台实战入门篇:数据中台对内、对外合作机制
- 深入浅析HTML5中的article和section的区别
- Tomcat系列(6)——Tomcat处理一个HTTP请求的过程
- xp和linux的引导文件,Linux与XP双系统中grub引导配置笔记
- java最长同值路径_力扣——最长同值路径
- mysql数据库银行项目题_银行数据库笔试编程题
- 合成孔径雷达影像(SAR图像)变化检测深度学习研究方法
- CNtV电视直播解析PHP,电视直播
- ceph HEALTH_WARN slow ops
- 云台山风景美如画,四大网红打卡景点等你来!
- java jsp实现注册登录界面_jsp实现简单的用户登录和注册
- 为什么说运维的未来必然是 AIOps?
- 送一台高配电脑,吃鸡贼爽!
- vega使用方法笔记
- 中文键盘 linux,键盘和中文输入 教程
- 《痞子衡嵌入式半月刊》 第 15 期
- RL——Policy Gradient类方法
- 开发2d游戏要用什么引擎_下一个游戏要使用什么2D游戏引擎
- 【查找网站后台方法总结整理】