👻 Linux 的無形助手:Daemon 與 Unit



在操作 Linux 系統時,您會發現許多 'Daemon' 在背景中默默運行。而我們則使用 systemd 這個工具來管理它們。這兩者之間有何關聯?為何會擁有如此獨特的名稱?正如每一行程式碼都蘊含著哲學,Linux 系統的架構也承載著清晰的設計理念。

linux_daemon_and_systemd_concept
systemd 向多個 daemon 發出工作指令的圖像

1. 為何稱作 'Daemon'?:隱於幕後的智能存在

'Daemon' 這個名稱源自希臘神話中,在神與人之間默默提供幫助的 '守護神 (Daemons)'。隨後,經過物理學家馬克士威 (Maxwell) 提出的 '馬克士威妖 (Maxwell’s Demon)' 假說,1963 年麻省理工學院 (MIT) 的開發者們將這個名稱賦予了 「無需使用者介入,在背景中自行判斷並運行的程式」

  • 本質: Daemon 不會直接與使用者互動。即使關閉終端機,它們仍駐留在記憶體中,等待網路請求或監控系統狀態,這就是 「背景行程 (Background Process)」 的意義所在。

2. systemd 也是 Daemon 嗎?:「管理 Daemon 的主 Daemon」



是的,沒錯。名稱末尾的 'd' 就是證明。systemd 是 Linux 核心啟動後第一個執行的 行程 (PID 1),也是驅動和管理所有其他 Daemon 的 「主 Daemon (Master Daemon)」

在此之前,Linux 管理 Daemon 的方式雜亂無章。systemd 的出現旨在平息這種混亂,並以 標準化的規範 管理所有系統元素。而這個標準規範,正是 'Unit'

3. Unit:驅動 Daemon 的「標準工作指示書」

如果 Daemon 是實際執行工作的「實體」,那麼 Unit 則是記載如何操作這些實體的「工作指示書」systemd 這個主 Daemon 會讀取我們編寫的這些指示書 (Unit),並根據其內容喚醒或停止各個 Daemon。

  • 意圖明確: 如果沒有 Unit 這個規範,每位開發者可能會以不同的方式編寫執行 Daemon 的程式碼。然而,由於有了 Unit (例如:.service 檔案) 這份標準指示書,我們得以非常精確且穩固地定義 「在何種環境下、以何種順序執行,以及若發生問題應如何重新啟動」
  • 靈活擴展: Unit 不僅僅是為了 Daemon (Service) 而存在。它以相同的「工作指示書」格式處理 Linux 中的所有元素,例如在特定時間執行任務的「計時器 (Timer)」,或連接裝置的「掛載 (Mount)」。因此,我們可以將整個系統以一致的邏輯進行擴展。

4. 關係一覽

分類 Daemon systemd Unit
本質 在記憶體中實際運行的 行程 (Process) 記錄系統設定的 規格檔案
角色 在背景中執行實際功能 定義 Daemon 的執行條件與運作方式
比喻 在現場默默工作的 工人 工人遵循的 工作指示書

總結來說:
systemd 這個主 Daemon 透過讀取 Unit (工作指示書),指揮眾多 Daemon (工人) 按照既定規則精確地運作。

5. 工人身份多元:正確區分 'Daemon' 與 'Service Unit'

當我們常說「啟動服務」時,實際在背景中運行的工人 (Daemon) 並非只有一種形式。無論使用何種語言開發,也無論其形態如何,只要能在背景中運行,都可以成為 Daemon。

多元的工人形式:

  • 腳本 Daemon:將自行編寫的 Python 程式碼,例如 Django 或 FastAPI,註冊為 Unit 後,它將透過 python3 執行器運行,成為一個 Python Daemon。

  • 二進位 Daemon:像 Nginx、sshd 這類使用 C 或 Go 語言預先編譯的程式,它們本身就是以執行檔形式存在的 Daemon。

  • Shell 腳本 Daemon:即使是一個簡單的 .sh 檔案,只要它在背景中以無限迴圈運行,也是一個優秀的工人 (Daemon)。

Service Unit 是「連結點」:

嚴格來說,sshd 或您的 Python 腳本本身並不是「服務」。它們僅僅是 Daemon (工人)。我們在 /etc/systemd/system/ 目錄中自行建立,或在安裝套件時自動註冊的 .service 檔案 (Unit),才是將這些工人註冊為系統正式成員的工作指示書。

結論

Daemon 指的是「在背景中運行的程式」這種狀態,而 Service Unit 則是將 Daemon 規範化,使其能被 systemd 這個主 Daemon 控制的規格說明書。正因為有這份指示書,systemd 才能不論工人的本質是 Python 還是二進位檔,都以相同的方式下達指令。

感覺如何呢?我以 Linux 作為主要系統已有四到五年,即使自認為已經掌握這兩者的概念,但在實際向他人解釋時卻感到非常困難。或許我以為自己懂了,但實際上並未完全理解。如今終於能用自己的語言來定義和整理,感覺思路變得清晰許多。

果然寫作是件有趣的事。儘管需要時間,但透過寫作能讓思緒更加清晰。