11.4. 管理 FreeBSD 中的服務
前一頁 | 章 11. 設定與調校 | 下一頁

## 11.4. 管理 FreeBSD 中的服務

Contributed by Tom Rhodes.

FreeBSD 在系統初始化時使用 rc(8) 系統的啟動 Script。列於 `/etc/rc.d` 的 Script 提供了基本的服務可使用 service(8) 加上 `start`, `stop` 以及 `restart` 選項來控制。例如，使用以下指令可以重新啟動 sshd(8)：

    # service sshd restart

這個程序可以用來在執行中的系統上啟動服務，而在 rc.conf(5) 中有指定的服務則會在開機時自動啟動。例如，要在系統啟動時開啟 natd(8)，可入下行到 `/etc/rc.conf`：

    natd_enable="YES"

若 `natd_enable="NO"` 行已存在，則將 `NO` 更改為 `YES`，在下次開機時 rc(8) script 便會自動載入任何相依的服務，詳細如下所述。

由於 rc(8) 系統主要用於在系統開機與關機時啟動與停止服務，只有當有服務的變數設定在 `/etc/rc.conf` 時 `start`, `stop` 以及 `restart` 才會有作用。例如 `sshd restart` 只會在 `/etc/rc.conf` 中的 `sshd_enable` 設為 `YES` 時才會運作，若要不透過 `/etc/rc.conf` 的設定來 `start`, `stop` 或 `restart` 一個服務則需要在指令前加上 “one”，例如要不透過目前在 `/etc/rc.conf` 的設定重新啟動 sshd(8) 可執行以下指令：

    # service sshd onerestart

要檢查一個服務是否有在 `/etc/rc.conf` 開啟，可執行服務的 rc(8) Script 加上 `rcvar`。這個例子會檢查 sshd(8) 是否在 `/etc/rc.conf` 已經開啟：

    # service sshd rcvar
    # sshd
    #
    sshd_enable="YES"
    #   (default: "")

### 注意:

行 `# sshd` 的輸出來自上述指令，而非 `root` console。

要判斷是一個服務是否正在執行，可使用 `status`，例如要確認 sshd(8) 是否正常在執行：

    # service sshd status
    sshd is running as pid 433.

在某些情況，也可以 `reload` 一個服務。這個動作會嘗試發送一個信號給指定的服務，強制服務重新載入其設定檔，在大多數的情況下，發送給服務的信號是 `SIGHUP`。並不是每個服務都有支援此功能。

rc(8) 系統會用在網路服務及也應用在大多數的系統初化 。例如執行 `/etc/rc.d/bgfsck` Script 會列印出以下訊息：

    Starting background file system checks in 60 seconds.

這個 Script 用來在背景做檔案系統檢查，只有在系統初始化時要執行。

許多系統服務會相依其他服務來運作，例如 yp(8) 及其他以 RPC 為基礎的服務在 rpcbind(8) 服務啟動前可能會啟動失敗。要解決這種問題，就必須在啟動 Script 上方的註解中加入相依及其他 meta-data。在系統初始化時會用 rcorder(8) 程式分析這些註解來決定要以什麼順序來執行系統服務以滿足相依。

因 rc.subr(8) 的需要，以下的關鍵字必須加入到所有的啟動 Script 方可 “enable” 啟動 Script：

- `PROVIDE`: 設定此檔案所提供的服務。

以下關鍵字可能會在每個啟動 Script 的上方引用，雖然非必要，但是對於 rcorder(8) 是非常有用的提示：

- `REQUIRE`: 列出此服務需要引用的服務。有使用此關鍵字的 Script 會在指定服務啟動 之後 才執行。

- `BEFORE`: 列出相依此服務的服務。有使用此關鍵字的 Script 會在指定的服務啟動 之前 執行。

透過仔細的設定每個啟動 Script 的這些關鍵字，管理者便可對 Script 的啟動順序進行微調，而不需使用到其他 UNIX® 作業系統所使用的 “runlevels”。

額外的資訊可在 rc(8) 以及 rc.subr(8) 中找到。請參考 此文章 來取得如何建立自訂 rc(8) Script 的操作說明。

### 11.4.1. 管理系統特定的設定

系統設定資訊的主要位於 `/etc/rc.conf`，這個檔案的設定資訊範圍非常廣且會在系統啟動時讀取來設定系統，它也提供設定資訊給 `rc*` 檔案使用。

在 `/etc/rc.conf` 中的設定項目會覆蓋在 `/etc/defaults/rc.conf` 的預設設定，不應直接編輯該檔案中的預設設定，所有系統特定的設定應到 `/etc/rc.conf` 所修改。

在叢集應用時要將系統特定的設定與各站特定的設定分開，藉此減少管理成本有好幾種方法，建議的方法是將系統特定的設定放置在 `/etc/rc.conf.local`，例如以下將要套用到所有系統的設定項目放在 `/etc/rc.conf`：

    sshd_enable="YES"
    keyrate="fast"
    defaultrouter="10.1.1.254"

而只套用到此系統的設定放在 `/etc/rc.conf.local`：

    hostname="node1.example.org"
    ifconfig_fxp0="inet 10.1.1.1/8"

使用應用程式如 rsync 或 puppet 將 `/etc/rc.conf` 散布到每個系統，而在各系統保留自己的 `/etc/rc.conf.local`。

升級系統並不會覆寫 `/etc/rc.conf`，所以系統設定資訊不會因此遺失。

### 提示:

`/etc/rc.conf` 以及 `/etc/rc.conf.local` 兩個檔案都會使用 sh(1) 解析，這讓系統操作者能夠建立較複雜的設定方案。請參考 rc.conf(5) 來取得更多有關此主題的資訊。

前一頁 | 上一層 | 下一頁
11.3. 設定 cron(8) | 起始頁 | 11.5. 設定網路介面卡

本文及其他文件，可由此下載： ftp://ftp.FreeBSD.org/pub/FreeBSD/doc/。

若有 FreeBSD 方面疑問，請先閱讀 FreeBSD 相關文件，如不能解決的話，再洽詢 <questions@FreeBSD.org>。
關於本文件的問題，請洽詢 <doc@FreeBSD.org>。