Daemon 與 Service 的關係#

  • Daemon:在背景持續運作的程序,等待請求並提供服務。名稱通常以 d 結尾(如 httpdsshdcrond
  • Service:daemon 所提供的功能。例如 httpd 這個 daemon 提供的是 HTTP 服務

在口語中,daemon 和 service 常被混用,但嚴格來說,daemon 是程式,service 是它的功能表現。

從 SysV init 到 systemd 的演進#

傳統 SysV init#

早期 Linux 使用 SysV init 管理服務:

  • 服務以 shell script 的形式存放在 /etc/init.d/
  • 開機時依序啟動,速度慢
  • 服務之間的相依性需要手動管理
  • runlevel(0~6)控制系統的運作狀態

systemd 的革新#

CentOS 7 開始採用 systemd 取代 SysV init,帶來根本性的改變:

  • 平行啟動:自動分析相依性,可以同時啟動不相依的服務,大幅加速開機
  • 統一管理介面:所有服務都用 systemctl 管理
  • 按需啟動(Socket Activation):服務可以在第一次被請求時才啟動,節省資源
  • 自動相依性管理:systemd 自動處理服務之間的啟動順序
  • cgroup 整合:精確追蹤每個服務的所有子程序

systemd 不只是一個服務管理器——它是整個系統的初始化與管理框架,涵蓋服務管理、日誌系統(journald)、計時器(timer)、掛載管理等。理解 systemd 是現代 Linux 管理的必備技能。

Unit 的概念#

systemd 將所有管理的對象統一稱為 Unit,每種 Unit 有不同的功能:

Unit 類型用途
.service系統服務
.socketSocket 監聽,用於按需啟動服務
.target一組 Unit 的集合,類似舊的 runlevel
.timer定時任務,可替代 crontab
.mount檔案系統掛載
.path監控檔案系統路徑的變化

Target:取代 runlevel#

target 是一組 Unit 的集合,定義了系統的「狀態」:

舊 runlevel對應 target說明
0poweroff.target關機
1rescue.target單人維護模式
3multi-user.target多人文字模式
5graphical.target圖形介面
6reboot.target重新開機

服務設定檔的位置#

systemd 的設定檔存放在兩個主要位置:

  • /usr/lib/systemd/system/:套件安裝時提供的原始設定,不應直接修改
  • /etc/systemd/system/:管理員的自訂設定,優先權高於前者

如果要修改某個服務的設定,正確做法是在 /etc/systemd/system/ 下建立一個覆蓋檔(override),而不是直接修改 /usr/lib/ 下的檔案。這樣套件更新時不會覆蓋你的自訂設定。

Service Unit 設定檔的結構#

一個 .service 檔案通常包含三個區段:

  • [Unit]:描述、相依性(After、Requires、Wants)
  • [Service]:服務的執行方式(ExecStart、Type、Restart、User)
  • [Install]:開機啟用的設定(WantedBy)

Timer Unit:systemd 的排程功能#

timer 是 systemd 內建的排程機制,可以替代 crontab:

  • 精確度更高:支援到毫秒
  • 與 journal 整合:排程的日誌自動被 systemd-journald 記錄
  • 相依性管理:可以與其他 Unit 關聯

雖然 timer 功能強大,但 crontab 的語法更簡潔直觀,在簡單排程場景中仍然是主流選擇。