初識Systemd

前言

依Linux系統慣例,帶字母d的一般爲守護進程(daemon),Systemd即爲System Daemon,是Linux下的一款系統和服務管理器,用於取代傳統的Init組件。
Systemd功能強大,諸如Gnome桌面、用戶登錄管理、網絡服務都已集成其中,甚至後續udev也要加入Systemd的"豪華套餐"。不過開源社區對於Systemd則是充滿了爭議:有人認爲它有利於Linux系統標準化;有人則認爲它管的太多——不符合UNIX
“keep simple, keep stupid"的設計哲學,總之是有褒有貶。而現在,越來越多的Linux發行版(如SUSE、RedHat、CentOS、Ububtu等)都開始使用Systemd,大勢所趨,Systemd在爭議之中竟有一統Linux發行版之勢。
作爲一個開發爲主,順便學學運維的小蝦米,我接觸Systemd的目的是爲了實現一個腳本開機自啓動的功能,至於其他的"是是非非”,自有肉食者謀,這裏便不過多評價。

單元、服務與配置文件

Systemd由許多單元(Unit)組成,例如我們熟悉的SSH、Samba、Firewall等服務(Service),都由與之相關的Systemd單元進行管理。

Systemd單元有許多類型,不僅有管理服務的單元,還有管理其他系統資源的單元(如socket、系統設備、掛載點、文件系統等)。

要了解一個單元,最直觀的方式就是查看它的配置文件,以SSH爲例,在Systemd中由單元sshd.service管理,執行以下命令可以查看配置文件內容:

$ systemctl cat sshd.service

SSH配置文件:

[Unit]
Description=OpenSSH server daemon
Documentation=man:sshd(8) man:sshd_config(5)
After=network.target sshd-keygen.service
Wants=sshd-keygen.service

[Service]
EnvironmentFile=/etc/sysconfig/sshd
ExecStart=/usr/sbin/sshd -D $OPTIONS
ExecReload=/bin/kill -HUP $MAINPID
Type=simple
KillMode=process
Restart=on-failure
RestartSec=42s

[Install]
WantedBy=multi-user.target

可以看到,配置文件分成幾個區塊,每個區塊包含若干條字段組成的鍵值對,下面對解上述配置文件中幾個關鍵字段的含義進行解釋:

  • Description
    當前服務的簡單描述
  • After
    啓動順序(與之對應還有Before),表示sshd.service在network.target與sshd-keygen.service之後啓動
  • ExecStart
    啓動命令,定義服務啓動時執行的命令
  • ExecReload
    重載命令,定義服務重載時執行的命令
  • Type
    啓動類型,下表列出了幾種常見的類型
描述
simple 默認值, 表示啓動的服務爲主進程
oneshot 類似於simple,只執行一次,Systemd等待執行完畢後才啓動其他服務
forking 以fork()方式啓動,父進程退出,子進程成爲主進程
  • WantedBy
    表示服務所在的Target

Target也是一種Systemd單元,可以理解爲服務組,即一系列服務的集合

實現一個開機自啓動服務

初步瞭解單元與配置文件後,我們就可以通過Systemd實現一個開機自啓動的服務了。例如現有一個程序MyProgram位於目錄/home下,欲使其開機自啓動,步驟如下:
1. 新增自定義服務
在/usr/lib/systemd目錄下新增配置文件MyProgram.service,如下:

[Unit]
Description=my program

[Service]
Type=oneshot
ExecStart=/home/MyProgram

[Install]
WantedBy=multi-user.target

2. 使能新增的服務
執行如下命令:

$ systemctl enable MyProgram.service

根據配置文件中字段WantedBy的值,該命令將在目錄/etc/systemd/system/multi-user.target下創建文件MyProgram.service的軟鏈接。
3. 查看運行狀態
如此操作後,系統將在啓動後執行程序MyProgram,執行如下命令查看服務的運行狀態

$ systemctl status MyProgram.service

4. 去使能新增的服務
如果想取消開機啓動MyProgram,則需執行以下命令:

$ systemctl disable MyProgram.service

參考:

  1. systemd (簡體中文) - ArchWiki
  2. Systemd 入門教程 - 阮一峯的網絡日誌
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章