译自:runit quick startgit
经过这篇教程,咱们能够快速了解runit并搭建起相应服务。github
runit是一个用于服务监控的UNIX软件,它提供如下两种服务:centos
当服务器启动的时候启动定义好的服务。bash
监控运行的服务,当服务发生意外中断的时候,自动重启服务。服务器
这篇教程将经过一个简单的示例来说解如何建立新的runit服务。若是你想了解更多信息,能够查看runit的官方文档。curl
本篇教程包括如下三部分:学习
建立一个runit模板测试
建立第一个服务ui
如何自动管理服务url
首先确保系统安装了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
运行如下命令来检查是否已经安装了runit而且系统已经运行了runit。
# ps -ef | grep runsvdir
输出结果以下:
root 2783 1 0 15:34 ? 00:00:00 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
为了便于开发与测试,这里咱们不直接在/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} 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 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
输出结果以下所示:
run: example: (pid 3483) 3s; run: log: (pid 3324) 154s
使用tail命令能够查看日志信息:
# tail -f /opt/example/logs/current
你会看到日志信息以及异常信息,接着服务重启。
最后,咱们再来学习下sv用法,sv用来手动管理咱们的服务。
检查服务的状态
sv status example
中止服务
sv stop example
中止服务以后不会再输出日志信息,也不会再自动重启。
重启服务
sv restart example
更多用法
man sv