Daemon 與 Service 的關係#
- Daemon:在背景持續運作的程序,等待請求並提供服務。名稱通常以
d結尾(如httpd、sshd、crond) - 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 | 系統服務 |
.socket | Socket 監聽,用於按需啟動服務 |
.target | 一組 Unit 的集合,類似舊的 runlevel |
.timer | 定時任務,可替代 crontab |
.mount | 檔案系統掛載 |
.path | 監控檔案系統路徑的變化 |
Target:取代 runlevel#
target 是一組 Unit 的集合,定義了系統的「狀態」:
| 舊 runlevel | 對應 target | 說明 |
|---|---|---|
| 0 | poweroff.target | 關機 |
| 1 | rescue.target | 單人維護模式 |
| 3 | multi-user.target | 多人文字模式 |
| 5 | graphical.target | 圖形介面 |
| 6 | reboot.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 的語法更簡潔直觀,在簡單排程場景中仍然是主流選擇。