[譯] runit 快速入門

譯自:runit quick startgit

概要

經過這篇教程,咱們能夠快速瞭解runit並搭建起相應服務。github

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

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

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

這篇教程將經過一個簡單的示例來說解如何建立新的runit服務。若是你想了解更多信息,能夠查看runit的官方文檔curl

本篇教程包括如下三部分:學習

  1. 建立一個runit模板測試

  2. 建立第一個服務ui

  3. 如何自動管理服務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用來手動管理咱們的服務。

  1. 檢查服務的狀態

    sv status example
  2. 中止服務

    sv stop example

    中止服務以後不會再輸出日誌信息,也不會再自動重啓。

  3. 重啓服務

    sv restart example
  4. 更多用法

    man sv
相關文章
相關標籤/搜索