[譯] runit 快速入門

JerriVAUO 8年前發布 | 61K 次閱讀 Linux命令 UNIX

譯自: runit quick start

概要

通過這篇教程,我們可以快速了解runit并搭建起相應服務。

runit是一個用于服務監控的UNIX軟件,它提供以下兩種服務:

  • 當服務器啟動的時候啟動定義好的服務。

  • 監控運行的服務,當服務發生意外中斷的時候,自動重啟服務。

這篇教程將通過一個簡單的示例來講解如何創建新的runit服務。如果你想了解更多信息,可以查看runit的 官方文檔

本篇教程包括以下三部分:

  1. 創建一個runit模板

  2. 創建第一個服務

  3. 如何自動管理服務

搭建環境

首先確保系統安裝了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用來手動管理我們的服務。

  1. 檢查服務的狀態

    sv status example
  2. 停止服務

    sv stop example

    停止服務之后不會再輸出日志信息,也不會再自動重啟。

  3. 重啟服務

    sv restart example
  4. 更多用法

    man sv

 

來自:https://segmentfault.com/a/1190000006644578

 

 本文由用戶 JerriVAUO 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!