Ubuntu上runit安装及使用教程

前言

runit是一个用于服务监控的UNIX软件,它提供以下两种服务:

  • 当服务器启动的时候启动定义好的服务。
  • 监控运行的服务,当服务发生意外中断的时候,自动重启服务。

这篇教程将通过一个简单的示例来讲解如何创建新的runit服务。如果你想了解更多信息,可以查看runit的官方文档。
本篇教程包括以下三部分:

  1. 创建一个runit模板
  2. 创建第一个服务
  3. 如何自动管理服务

1、搭建环境

runit软件包不提供开箱即用的systemd单位文件。但是有一个特殊的软件包可以提供它:runit-systemd。

只需安装此软件包,runit即可完成工作。

sudo apt install runit-systemd

运行如下命令来检查是否已经安装了runit并且系统已经运行了runit。

ps -ef | grep runsvdir

输出结果如下:

root       793     1  0 16:03 ?        00:00:00 runsvdir -P /etc/service log: ...........................................................................................................................................................................................................................................................................................................................................................................................................

runsvdir其实是一套组件,这些组件可以满足用户的各种需求,核心组件包括了runsvdir,runsv, chpst,svlogd以及sv。

2、创建模版

注意输出结果中的runsvdir -P /etc/service log:......., 它的意思是runsvdir会监控/etc/service/目录下的文件,这些文件用于配置被监控的服务。
被监控的服务是通过在/etc/service目录下创建子目录,并添加可执行脚本run来实现的。
当runsvdir发现新的配置文件时,它就会自动启动一个runsv进程来管理这个配置的服务。
runit的设计思想就是每个组件的功能是完全独立的,以便管理。可以使用man命令查看具体组件的用法:

man runsvdir

确保存在```/etc/service`目录,如果不存在,则使用mkdir创建相应目录:

mkdir /etc/service

为了便于开发与测试,这里我们不直接在/etc/service/目录中添加配置文件,而是创建一个暂存的目录来放置配置文件。
当我们满意自己的测试之后,再使用软链接,将暂存目录链接到/etc/service

创建/etc/runit作为暂存目录。

mkdir  /etc/runit

在创建一个真正的runit服务之前,我们先创建一个模板。这个模板将展示runit的基本用法,以后可以直接使用这个模板创建新的服务。
首先创建template目录:

sudo 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脚本。

3、服务示例

接下来,我们使用上面创建的模板来创建一个简单的服务配置。首先创建需要再run脚本中被chpst使用的用户:

adduser cmcm

接下来创建放置服务配置的目录,并将它的所属用户与用户组设置为cmcm。

mkdir /opt/example
chown foo:foo /opt/example

接下来切换到cmcm用户:

su cmcm

/opt/example目录中添加脚本foo-service.sh:

#!/bin/bash

echo "Started service..."

for i in {1..30}
do
   echo "Doing stuff..."
   sleep 1
done

echo "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 cmcm /opt/example/foo-service.sh

同样的,更新/etc/runit/example/log/run脚本内容:

#!/bin/sh
exec chpst -u cmcm svlogd -tt /opt/example/logs

在将服务部署到/etc/service前,首先测试下配置是否正确:

/etc/runit/example/run

如果脚本运行正常,就可以部署服务了,创建一个软链接:

ln -s /etc/runit/example /etc/service/example

不出意外的话,runsvdir会检测到我们配置的两个服务,然后启动两个runsv进程来执行并监控服务。通过下面的命令可以检测服务是否正常运行。

sv status example

输出结果如下所示:

run: example: (pid 1322) 10s; run: log: (pid 1285) 40s

使用tail命令可以查看日志信息:

tail -f /opt/example/logs/current

你会看到日志信息以及异常信息,接着服务重启。

4、管理服务

最后,我们再来学习下sv用法,sv用来手动管理我们的服务。
(1)检查服务状态

sv status example

(2)停止服务

sv stop example

停止服务之后不会再输出日志信息,也不会再自动重启。
(3)重启服务

sv restart example

(4)更多用法

man sv
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值