套用至 SUSE Linux Enterprise Desktop 12

11 systemd 精靈

程式 systemd 是程序 ID 為 1 的程序。負責以所需的方式啟始化系統。systemd 由核心直接啟動並拒絕訊號 9,該訊號通常會終止程序。所有其他程式不是由 systemd 直接啟動,就是由它的子程序啟動。

SUSE Linux Enterprise Desktop 12 起,systemd 取代了常用的 System V init 精靈。systemd 與 System V init 完全相容 (透過支援 init 程序檔)。systemd 的其中一個主要優點在於它透過積極主動的平行服務啟動,使開機速度顯著加快。另外,systemd 僅在切實需要服務時才會啟動該服務。它在開機時不會無條件地啟動精靈,而是在第一次需要時予以啟動。systemd 還支援「核心控制群組」(cgroup),對系統狀態拍攝快照並還原等等。如需詳細資料,請參閱http://www.freedesktop.org/wiki/Software/systemd/

11.1 systemd 概念

本節將詳細討論 systemd 背後的概念。

11.1.1 systemd 是什麼

systemd 是適用於 Linux 的系統和工作階段管理員,它與 System V 及 LSB init 程序檔相容。主要功能如下:

  • 提供積極主動的平行化功能

  • 使用插槽及 D-Bus 啟用方式來啟動服務

  • 提供精靈的隨需啟動

  • 使用 Linux cgroup 追蹤程序

  • 支援對系統狀態拍攝快照並還原

  • 維護掛接點和自動掛接點

  • 實作事務相關型複雜的服務控制邏輯

11.1.2 單位檔案

單位組態檔案針對以下項目的資訊進行編碼︰服務、插槽、裝置、掛接點、自動掛接點、交換檔或分割區、啟動目標、所監視之檔案系統的路徑、受 systemd 控制和監督的計時器、暫時系統狀態快照、資源管理片段或外部建立的程序群組。 單位檔案是 systemd 用於表示下列項目的通用術語︰

  • 服務.  程序相關資訊 (例如執行精靈);檔案名以 .service 結尾

  • 目標.  用於將單位分組以及在啟動期間用作同步點;檔案名以 .target 結尾

  • 插槽.  IPC 或網路插槽或檔案系統 FIFO 的相關資訊,適用於插槽型啟動 (如 inetd);檔案名以 .socket 結尾

  • 路徑.  用於觸發其他單位 (例如,在檔案變更時執行服務);檔案名以 .path 結尾

  • 計時器.  受控計時器的相關資訊,適用於計時器型啟動;檔案名以 .timer 結尾

  • 掛接點.  通常由 fstab 產生器自動產生;檔案名以 .mount 結尾

  • 自動掛接點.  檔案系統自動掛接點的相關資訊;檔案名以 .automount 結尾

  • Swap.  用於記憶體分頁之交換裝置或檔案相關資訊;檔案名以 .swap 結尾

  • 裝置.  sysfs/udev(7) 裝置樹中所展示之裝置的相關資訊;檔案名以 .automount 結尾

  • 範圍/片段.  分階層管理程序群組之資源的概念;檔案名以 .scope/.slice 結尾

如需有關 systemd.unit 的詳細資訊,請參閱 http://www.freedesktop.org/software/systemd/man/systemd.unit.html

11.2 基本用法

System V init 系統使用若干個不同的指令來處理服務 — init 程序檔、insservtelinit 及其他。systemd 可以簡化服務管理,因為對於大部分處理服務的任務,只需記住一條指令︰systemctl。它使用 指令加子指令表示法,與 gitzypper 相似︰

systemctl [general OPTIONS] subcommand [subcommand OPTIONS]

如需完整的手冊,請參閱 man 1 systemctl

提示
提示:終端機輸出和 Bash 完成法

如果輸出進入終端機 (而不是進入管線或檔案之類),依預設,systemd 指令會將長輸出傳送到切換程式。使用 --no-pager 選項可關閉切換模式。

systemd 還支援 bash 完成法,它可讓您輸入子指令的第一個字母,然後按 →| 自動填全子指令。此功能僅可用於 bash 外圍程序,並且需要安裝套件 bash-completion

11.2.1 管理正在執行的系統中的服務

用於管理服務的子指令與透過 System V init 管理服務的子指令相同 (startstop、...)。下面列出了服務管理指令的通用語法︰

systemd
systemctl reload|restart|start|status|stop|... <my_service(s)>.service
System V init
rc<my_service(s)> reload|restart|start|status|stop|...

systemd 可讓您一次管理多個服務。它不是像 System V init 那樣依次執行 init 程序檔,而是執行類似如下的指令︰

systemctl start <my_1st_service>.service <my_2nd_service>.service

如果您要列出系統上可用的所有服務︰

systemctl list-unit-files --type=service

下表列出了 systemd 和 System V init 的最重要的服務管理指令︰

表格 11.1 服務管理指令

任務

systemd 指令

System V init 指令

啟動. 

start
start

停止. 

stop
stop

重新啟動.  關閉服務,然後啟動這些服務。如果某項服務並未執行,則會將其啟動。

restart
restart

有條件地重新啟動.  如果服務目前正在執行中,則予以重新啟動。對於未在執行中的服務,則不執行任何動作。

try-restart
try-restart

重新載入.  指示服務重新載入它們的組態檔案,而不中斷操作。使用案例︰指示 Apache 重新載入修改過的 httpd.conf 組態檔案。請注意,並非所有服務都支援重新載入。

reload
reload

重新載入或重新啟動.  如果服務支援重新載入,則重新載入服務,否則重新啟動服務。如果某項服務並未執行,則會將其啟動。

reload-or-restart
n/a

有條件地重新載入或重新啟動.  如果服務支援重新載入,則重新載入服務,否則重新啟動那些目前正在執行的服務。對於未在執行中的服務,則不執行任何動作。

reload-or-try-restart
n/a

取得詳細的狀態資訊.  列出服務狀態的相關資訊。systemd 指令顯示詳細資料,例如描述、可執行檔、狀態、cgroup 及服務發出的最新訊息 (請參閱第 11.6.6 節「服務除錯」)。使用 System V init 顯示的詳細資料級別因服務而異。

status
status

取得簡要的狀態資訊.  顯示服務是否處於使用中狀態。

is-active
status

11.2.2 永久啟用/停用服務

上一節中提及的服務管理指令可讓您操作目前工作階段的服務。systemd 還可讓您永久啟用或停用服務,使之可以按要求自動啟動,或者始終無法使用。此操作可以透過 YaST 或在指令行上執行。

11.2.2.1 在指令行上啟用/停用服務

下表列出了 systemd 和 System V init 的啟用和停用指令︰

重要
重要:服務啟動

在指令行上啟用服務時,服務不會自動啟動。系統將其排定為下一次系統啟動或執行層級/目標變更時啟動。若要在啟用服務之後立即啟動它,請明確執行 systemctl start <我的服務>.service or rc<我的服務> start

表格 11.2 用於啟用和停用服務的指令

任務

systemd 指令

System V init 指令

啟用. 

systemctl enable <我的服務>.service

insserv <我的服務>

停用. 

systemctl disable <我的服務>.service

insserv -r <我的服務>

檢查.  顯示是否已啟用某個服務。

systemctl is-enabled <我的服務>.service

重新啟用.  與重新啟動服務相似,此指令先停用服務,然後再啟用該服務。若要使用服務的預設值重新啟用服務,可使用此任務。

systemctl reenable <我的服務>.service

遮罩.  停用某項服務之後,仍然可以手動啟動它。若要徹底停用服務,您需要予以遮罩。使用須謹慎。

systemctl mask <我的服務>.service

取消遮罩.  遮罩某項服務之後,惟有先將其取消遮罩,才能再次予以使用。

systemctl unmask <我的服務>.service

11.3 系統啟動和目標管理

啟動系統和關閉系統的整個程序由 init 維護。從這個角度看,核心可以視為一個背景程序,負責維護所有其他的程序,以及根據其他程式的要求來調整 CPU 時間和硬體存取。

11.3.1 目標與執行層級比對

使用 System V init 時,系統將開機進入 執行層級。執行層級定義了系統的啟動方式,以及在所執行的系統中可以使用哪些服務。執行層級標有編號;最常見的執行層級是 0 (關閉系統)、3 (多重使用者,包含網路) 和 5 (多重使用者,包含網路及顯示管理員)。

systemd 透過使用 目標單位引入新的概念。不過,它仍然與執行層級概念完全相容。目標單位是有名稱而不是有編號的,它有多個作用。例如,目標 local-fs.targetswap.target 掛接本地檔案系統和交換空間。

目標 graphical.target 提供包含網路和顯示管理員功能的多重使用者系統,與執行層級 5 相當。複雜的目標,例如 graphical.target 透過結合其他目標的子集用作 中繼目標。因為 systemd 能夠組合現有目標,便於使用者更便利地建立自定目標,因此提供了可觀的靈活性。

下列清單顯示了最重要的 systemd 目標單位。如需完整清單,請參閱 man 7 systemd.special

選定的 systemd 目標單位
default.target

預設開機的目標。這並非 真實目標,而是一個符號連結,指向 graphic.target 之類的另一個目標。可透過 YaST 永久變更 (請參閱第 11.4 節「使用 YaST 管理 服務」)。若要為某個工作階段變更該目標,請在開機提示中使用核心指令行選項 systemd.unit=<我的目標>.target

emergency.target

在主控台上啟動緊急外圍程序。請僅根據開機提示使用,相應的方法為︰systemd.unit=emergency.target

graphical.target

啟動包含網路、多重使用者支援和顯示管理員功能的系統。

halt.target

關閉系統。

mail-transfer-agent.target

啟動傳送和接收郵件所需的所有服務。

multi-user.target

啟動包含網路的多重使用者系統。

reboot.target

系統重新開機。

rescue.target

啟動不包含網路的單一使用者系統。

為了保持與 System V init 執行層級系統相容,systemd 提供了名為 runlevelX.target 的特殊目標,可映射至編號為 X 的相應執行層級。

如果您要知道目前的目標,請使用指令︰systemctl get-default

表格 11.3 System V 執行層級和 systemd 目標單位

System V 執行層級

systemd 目標

用途

0

runlevel0.targethalt.targetpoweroff.target

關閉系統

1, S

runlevel1.targetrescue.target

單一使用者模式

2

runlevel2.targetmulti-user.target

本地多重使用者,不包含遠端網路

3

runlevel3.targetmulti-user.target

完整的多重使用者,包含網路

4

runlevel4.target

未使用/使用者定義

5

runlevel5.targetgraphical.target

完整的多重使用者,包含網路及顯示管理員

6

runlevel6.targetreboot.target

系統重新開機

重要
重要:systemd 忽略 /etc/inittab

System V init 系統中的執行層級在 /etc/inittab 中設定。systemd 使用此組態。如需如何建立您自己的可開機目標的指示,請參閱第 11.5.3 節「建立自定目標」

11.3.1.1 用於變更目標的指令

請使用下列指令來操作目標單位︰

任務

systemd 指令

System V init 指令

變更目前的目標/執行層級

systemctl isolate <我的目標>.target

telinit X

變更為預設目標/執行層級

systemctl default

取得目前的目標/執行層級

systemctl list-units --type=target

對 systemd 而言,使用中的目標一般不止一個。該指令列出目前處於使用中狀態的所有目標。

who -r

runlevel

永久性變更預設的執行層級

使用服務管理員或執行下列指令︰

ln -sf /usr/lib/systemd/system/<我的目標>.target /etc/systemd/system/default.target

使用服務管理員或變更以下行

id:X:initdefault:

(位於 /etc/inittab 中)

變更目前開機程序的預設執行層級

在開機提示的選項中輸入下列文字:

systemd.unit=<我的目標>.target

在開機提示中輸入所需的執行層級編號。

顯示目標/執行層級的相依性

systemctl show -p "Requires" <我的目標.target>

systemctl show -p "Wants" <我的目標.target>

Requires 會列出硬相依性 (必須解析的相依性),而 Wants 則列出軟相依性 (可行時解析的相依性)。

11.3.2 系統啟動除錯

systemd 針對系統啟動過程提供了分析方法。您可以方便地檢閱所有服務及其狀態的清單 (而不必剖析 /varlog/)。systemd 還允許您掃描啟動程序,以瞭解每項服務耗費多長時間啟動。

11.3.2.1 檢閱服務啟動

若要檢閱自從系統開機以來已啟動的完整服務清單,請輸入指令 systemctl。這將列出所有使用中的服務,如下方所述 (已縮短)。若要取得特定服務的更多資訊,請使用 systemctl status <我的服務>.service

範例 11.1 列出使用中的服務
root # systemctl
UNIT                                LOAD   ACTIVE SUB       JOB DESCRIPTION
[...]
systemd-random-seed-load.path       loaded active waiting       Random Seed
acpid.service                       loaded active running       ACPI Event Daemon
apache2.service                     loaded failed failed        apache
avahi-daemon.service                loaded active running       Avahi mDNS/DNS-SD Stack
bluez-coldplug.service              loaded active exited        LSB: handles udev coldplug of bluetooth dongles
console-kit...-system-start.service loaded active exited        Console System Startup Logging
cron.service                        loaded active running       Command Scheduler
cups.service                        loaded active running       CUPS Printing Service
[...]
LOAD   = Reflects whether the unit definition was properly loaded.
ACTIVE = The high-level unit activation state, i.e. generalization of SUB.
SUB    = The low-level unit activation state, values depend on unit type.
JOB    = Pending job for the unit.

107 units listed. Pass --all to see inactive units, too.

若要限制為輸出無法啟動的服務,請使用 --failed 選項︰

範例 11.2 列出失敗的服務
root # systemctl --failed
UNIT                   LOAD   ACTIVE SUB    JOB DESCRIPTION
apache2.service        loaded failed failed     apache
NetworkManager.service loaded failed failed     Network Manager
plymouth-start.service loaded failed failed     Show Plymouth Boot Screen

[...]

11.3.2.2 啟動時間除錯

為了對系統啟動時間除錯,systemd 提供了 systemd-analyze 指令。它會顯示總啟動時間以及按啟動時間排序的服務清單,還可以產生 SVG 圖,其中顯示各服務相對於其他服務所耗費的啟動時間。

列出系統啟動時間
root # systemd-analyze
Startup finished in 2666ms (kernel) + 21961ms (userspace) = 24628ms
列出服務啟動時間
root # systemd-analyze blame
  6472ms systemd-modules-load.service
  5833ms remount-rootfs.service
  4597ms network.service
  4254ms systemd-vconsole-setup.service
  4096ms postfix.service
  2998ms xdm.service
  2483ms localnet.service
  2470ms SuSEfirewall2_init.service
  2189ms avahi-daemon.service
  2120ms systemd-logind.service
  1210ms xinetd.service
  1080ms ntp.service
[...]
    75ms fbset.service
    72ms purge-kernels.service
    47ms dev-vda1.swap
    38ms bluez-coldplug.service
    35ms splash_early.service
服務啟動時間圖
root # systemd-analyze plot > jupiter.example.com-startup.svg

11.3.2.3 檢閱完成的啟動程序

上述指令可用於檢閱已啟動的服務及其啟動所耗費的時間。如果您需要知道更多詳細資料,可以在開機提示中輸入下列參數,指示 systemd 詳細記錄完整的啟動程序︰

systemd.log_level=debug systemd.log_target=kmsg

現在,systemd 會將記錄訊息寫入核心環緩衝區。該緩衝區可透過 dmesg 檢視︰

dmesg -T | less

11.3.3 System V 相容性

Systemd 與 System V 相容,因此,您仍可以使用現有的 System V init 程序檔。但是,至少有一個已知問題會導致 System V init 程序檔不能依原樣與 Systemd 配合使用:透過 init 程序檔中的 susudo 以其他使用者身分啟動服務,會導致程序檔失敗,從而產生拒絕存取錯誤。

使用 susudo 變更使用者時,會啟動 PAM 工作階段。完成 init 程序檔後會終止此工作階段。因此,init 程序檔啟動的服務也會終止。若要解決此問題,請執行下列步驟:

  1. 建立與 init 程序檔同名、副檔名為 .service 的服務檔案包裝程式。

    [Unit]
    Description=DESCRIPTION
    After=network.target
    
    [Service]
    User=USER
    Type=forking1
    PIDFile=PATH TO PID FILE1
    ExecStart=PATH TO INIT SCRIPT start
    ExecStop=PATH TO INIT SCRIPT stop
    ExecStopPost=/usr/bin/rm -f PATH TO PID FILE1
    
    [Install]
    WantedBy=multi-user.target2

    以適當的值取代 UPPERCASE LETTERS 中寫入的所有值。

    1

    選擇性 — 僅當 init 程序檔啟動精靈時才使用。

    2

    multi-user.target 在開機到 graphical.target 時也會啟動 init 程序檔。如果只應在開機到顯示管理員時才將它啟動,請在此處使用 graphical.target

  2. 使用 systemctl start 應用程式.service 啟動精靈。

11.4 使用 YaST 管理 服務

基本服務管理也可以透過 YaST 服務管理員模組實現。該模組不僅支援啟動、停止、啟用和停用服務,還可用於顯示服務的狀態以及變更預設目標。若要啟動 YaST 模組,請選取YaST › 系統 › 服務管理員

服務管理員
圖形 11.1 服務管理員
變更預設系統目標

若要變更系統開機進入的目標,請從預設系統目標下拉方塊中選擇目標。最常用的目標是圖形介面 (啟動圖形登入畫面) 和多重使用者 (以指令行模式啟動系統)。

啟動或停止服務

從表中選取服務。使用中欄顯示它目前是在執行中 (使用中) 還是未執行 (非使用中)。其狀態可透過選擇啟動/停止進行切換。

如果啟動或停止服務,會變更其對目前執行中工作階段而言的狀態。若要在整個重新開機期間變更服務的狀態,您需要啟用或停用服務。

啟用或停用服務

從表中選取服務。已啟用欄顯示它目前是已啟用還是已停用。其狀態可透過選擇啟用/停用進行切換。

透過啟用或停用服務,可設定在開機期間是否啟動該服務 (已啟用已停用)。此設定不影響目前的工作階段。若要變更該服務在目前工作階段中的狀態,您需要予以啟動或停止。

檢視狀態訊息

若要檢視服務的狀態訊息,請從清單中選取該服務,然後選擇 顯示詳細資料。所顯示的輸出與 systemctl -l status <我的服務> 指令產生的輸出完全相同。

警告
警告:錯誤的執行層級設定可能會造成系統損害

錯誤的執行層級設定可能會導致系統無法使用。在您套用變更之前,請務必確定您知道它們的後果。

11.5 自定 systemd

下列各節列出了 systemd 自定的一些範例。

警告
警告:避免覆寫的範例

請務必在 /etc/systemd/ 中而絕非 /usr/lib/systemd/ 中自定。否則,下次更新 systemd 時會覆寫您的變更。

11.5.1 自定服務檔案

systemd 服務檔案位於 /usr/lib/systemd/system 中。如果您要自定服務檔案,請執行下列步驟:

  1. 將要修改的檔案從 /usr/lib/systemd/system 複製到 /etc/systemd/system。保持檔案名稱不變。

  2. 根據需要修改 /etc/systemd/system 中的副本。

  3. 如需組態變更概觀,請使用 systemd-delta 指令。它會比較並識別哪些組態檔案覆寫其他組態檔案。如需詳細資料,請參閱 sleha-init man 頁面。

/etc/systemd 中修改過的檔案優先於 /usr/lib/systemd/system 中的原始檔案,前提是它們的檔案名稱相同。

11.5.2 建立 放入式檔案

如果您只想在組態檔案中新增若干行或修改一小部分,可以使用放入式檔案。放入式檔案可讓您延伸單位檔案的組態,而不必編輯或覆寫單位檔案本身。

例如,若要變更位於 /usr/lib/systemd/system/ foobar.service 中的 foobar 服務的一個值,請執行下列步驟:

  1. 建立名為 /etc/systemd/system/<我的服務>.service.d/ 的目錄。

    注意字尾為 .d。該目錄必須命名為要透過所放入之檔案修補的服務。

  2. 在該目錄中,建立檔案 whatevermodification.conf

    確保該檔案僅包含待修改值所在的行。

  3. 將您所做的變更儲存到檔案中。它將用作原始檔案的延伸。

11.5.3 建立自定目標

在 System V init SUSE 系統上並未使用執行層級 4,便於管理員自行建立執行層級組態。systemd 可讓您建立任意個自定目標。建議您在開始時先在 graphical.target 等現有的目標上調整。

  1. 將組態檔案 /usr/lib/systemd/system/graphical.target 複製到 /etc/systemd/system/<我的目標>.target,並根據需要調整該檔案。

  2. 上一步中複製的組態檔案已涵蓋該目標的必要的 () 相依性。若要一並納入需要的 () 相依性,請建立目錄 /etc/systemd/system/<我的目標>.target.wants

  3. 對於每個想要的服務,建立從 /usr/lib/systemd/system 指向 /etc/systemd/system/<我的目標>.target.wants 的符號連結。

  4. 目標設定完畢後,重新載入 systemd 組態以便能夠使用新目標︰

    systemctl daemon-reload

11.6 進階用法

下列各節涵蓋進階主題,適用於系統管理員。如需更為進階的 systemd 文件,請參閱 Lennart Pöttering 針對管理員撰寫的 systemd 系列文章,網址為 http://0pointer.de/blog/projects

11.6.1 系統記錄

第 11.6.6 節「服務除錯」說明如何檢視給定服務的記錄訊息。然而,記錄的訊息顯示並不局限為服務記錄。您還可以存取和查詢 systemd 寫入的完整記錄訊息 — 亦即日誌。使用指令 systemd-journalctl 可顯示從最舊項目開始的完整記錄訊息。如需套用過濾器或變更輸出格式等選項的資訊,請參閱 man 1 systemd-journalctl

11.6.2 快照

您可以使用 isolate 子指令將 systemd 的目前狀態儲存到指定的快照,日後可以回復到該狀態。此功能在測試服務或自定目標時非常有用,因為它允許您隨時回到定義的狀態。快照僅在目前工作階段中可用,重新開機時將自動刪除。快照名稱必須以 .snapshot 結尾。

建立快照
systemctl snapshot <my_snapshot>.snapshot
刪除快照
systemctl delete <my_snapshot>.snapshot
檢視快照
systemctl show <my_snapshot>.snapshot
啟動快照
systemctl isolate <my_snapshot>.snapshot

11.6.3 載入核心模組

使用 systemd,可透過以下位置中的組態檔案,在開機時自動載入核心模組︰

  • /usr/lib/modules-load.d

  • /etc/modules-load.d

如需詳細資訊,請參閱 modules-load.d(5) 線上文件。

11.6.4 核心控制群組 (cgroup)

在傳統 System V init 系統上不一定能將程序明確指派給繁衍它的服務。有些服務 (例如 Apache) 會繁衍許多協力廠商程序 (例如 CGI 或 Java 程序),這些程序本身又會繁衍許多程序。這導致您很難明確指派,甚至根本無法明確指派。另外,服務在不當終止後,可能殘留其部分子項保持活動狀態。

systemd 將每個服務放入它自己的 cgroup 中,從而解決此問題。cgroup 是一個核心功能,允許將程序及其所有子項結集至分層組織的群組中。systemd 根據相應的服務為每個 cgroup 命名。由於程序未經特許不得 離開其 cgroup,因此這樣可以有效地使用服務名稱標記該服務繁衍的所有程序。

若要列出屬於服務的所有程序,請使用指令 systemd-cgls。結果類似於以下範例 (已縮短) ︰

範例 11.3 列出屬於服務的所有程序
root # systemd-cgls --no-pager
├─1 /usr/lib/systemd/systemd --switched-root --system --deserialize 20
├─user.slice
│ └─user-1000.slice
│   ├─session-102.scope
│   │ ├─12426 gdm-session-worker [pam/gdm-password]
│   │ ├─15831 gdm-session-worker [pam/gdm-password]
│   │ ├─15839 gdm-session-worker [pam/gdm-password]
│   │ ├─15858 /usr/lib/gnome-terminal-server

[...]

└─system.slice
  ├─systemd-hostnamed.service
  │ └─17616 /usr/lib/systemd/systemd-hostnamed
  ├─cron.service
  │ └─1689 /usr/sbin/cron -n
  ├─ntpd.service
  │ └─1328 /usr/sbin/ntpd -p /var/run/ntp/ntpd.pid -g -u ntp:ntp -c /etc/ntp.conf
  ├─postfix.service
  │ ├─ 1676 /usr/lib/postfix/master -w
  │ ├─ 1679 qmgr -l -t fifo -u
  │ └─15590 pickup -l -t fifo -u
  ├─sshd.service
  │ └─1436 /usr/sbin/sshd -D

[...]

如需 cgroup 的詳細資訊,請參閱Chapter 8, Kernel Control Groups, System Analysis and Tuning Guide

11.6.5 終止服務 (傳送信號)

第 11.6.4 節「核心控制群組 (cgroup)」中所述,在 System V init 系統中不一定能將程序指派給其父服務,導致難以終止服務及其所有子項。未終止的子程序將保留為廢止程序。

systemd 的理念在於將每個服務限制在 cgroup 中,從而得以明確識別服務的所有子程序,因此可讓您傳送信號給這些程序中的每個程序。可使用 systemctl kill 將信號傳送給服務。如需可用信號清單,請參閱 man 7 signals

SIGTERM 傳送給服務

SIGTERM 是傳送的預設信號。

systemctl kill <my_service>.service
信號傳送給服務

可使用 -s 選項指定應傳送的信號。

systemctl kill -s SIGNAL <my_service>.service
選取程序

依預設,kill 指令會將信號傳送給指定 cgroup 的 all 程序。您可以將傳送目標限制為 controlmain 程序。後者非常實用,如下例透過傳送 SIGHUP 強制服務重新載入其組態所示︰

systemctl kill -s SIGHUP --kill-who=main <my_service>.service

11.6.6 服務除錯

systemd 依預設不會過度記錄詳細資料。如果服務啟動成功,則不會產生任何輸出。如果啟動失敗,則會顯示簡短的錯誤訊息。不過,systemctl status 可讓您以不同方式對服務的啟動和作業進行除錯。

systemd 隨附自己的記錄機製 ( 日誌),可以記錄系統訊息,便於您一併顯示服務訊息與狀態訊息。status 指令的工作方式與 tail 相似,也可以採用不同的格式顯示記錄訊息,因此成為功能強大的除錯工具。

顯示服務啟動失敗

只要服務啟動失敗,均可使用 systemctl status <我的服務>.service 來取得詳細的錯誤訊息︰

root # systemctl start apache2.service
Job failed. See system journal and 'systemctl status' for details.
root # systemctl status apache2.service
   Loaded: loaded (/usr/lib/systemd/system/apache2.service; disabled)
   Active: failed (Result: exit-code) since Mon, 04 Jun 2012 16:52:26 +0200; 29s ago
   Process: 3088 ExecStart=/usr/sbin/start_apache2 -D SYSTEMD -k start (code=exited, status=1/FAILURE)
   CGroup: name=systemd:/system/apache2.service

Jun 04 16:52:26 g144 start_apache2[3088]: httpd2-prefork: Syntax error on line
205 of /etc/apache2/httpd.conf: Syntax error on li...alHost>
顯示最近 n 條服務訊息

status 子指令的預設行為是顯示服務發出的最近 10 條訊息。若要變更所顯示的訊息數,請使用 --lines=n 參數︰

systemctl status ntp.service
systemctl --lines=20 status ntp.service
以附加模式顯示服務訊息

若要顯示服務訊息的 即時串流,請使用 --follow 選項,其工作方式與 tail -f 相似︰

systemctl --follow status ntp.service
訊息輸出格式

--output=模式參數可讓您變更服務訊息的輸出格式。最重要的可用模式如下︰

short

預設格式。顯示記錄訊息及易於理解的時戳。

verbose

完整輸出所有欄位。

cat

精簡輸出,不含時戳。

11.7 詳細資訊

如需 systemd 的詳細資訊,請參閱下列線上資源︰

首頁

http://www.freedesktop.org/wiki/Software/systemd

管理員的 systemd

Lennart Pöttering 是 systemd 的原著者之一,他撰寫了一系列部落格文章 (寫本章時已有 13 篇),其網址為 http://0pointer.de/blog/projects

控制中心︰systemd Linux init 系統

http://www.h-online.com/open/features/Control-Centre-The-systemd-Linux-init-system-1565543.html

啟動︰適用於 Linux init 工具 systemd 的工具和提示

http://www.h-online.com/open/features/Booting-up-Tools-and-tips-for-systemd-1570630.html

列印此頁面