譯自: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