[譯] 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
運行以下命令來檢查是否已經安裝了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
來自:https://segmentfault.com/a/1190000006644578