## 👻 Linux 的無形助手:Daemon 與 Unit {#sec-6e36ad82c8cb} 在操作 [[Linux]] 系統時,您會發現許多 'Daemon' 在背景中默默運行。而我們則使用 `systemd` 這個工具來管理它們。這兩者之間有何關聯?為何會擁有如此獨特的名稱?正如每一行程式碼都蘊含著哲學,Linux 系統的架構也承載著清晰的設計理念。 ![linux_daemon_and_systemd_concept](/media/editor_temp/6/a66caf8f-e91b-4373-af97-e3f7158d0194.png "systemd 向多個 daemon 發出工作指令的圖像") ## 1. 為何稱作 'Daemon'?:隱於幕後的智能存在 {#sec-facc962b0b1c} 'Daemon' 這個名稱源自希臘神話中,在神與人之間默默提供幫助的 **'守護神 (Daemons)'**。隨後,經過物理學家馬克士威 (Maxwell) 提出的 '馬克士威妖 (Maxwell’s Demon)' 假說,1963 年麻省理工學院 (MIT) 的開發者們將這個名稱賦予了 **「無需使用者介入,在背景中自行判斷並運行的程式」**。 * **本質:** Daemon 不會直接與使用者互動。即使關閉終端機,它們仍駐留在記憶體中,等待網路請求或監控系統狀態,這就是 **「背景行程 (Background Process)」** 的意義所在。 ## 2. systemd 也是 Daemon 嗎?:「管理 Daemon 的主 Daemon」 {#sec-3737e1c3330} 是的,沒錯。名稱末尾的 **'d'** 就是證明。`systemd` 是 Linux 核心啟動後第一個執行的 **行程 (PID 1)**,也是驅動和管理所有其他 Daemon 的 **「主 Daemon (Master Daemon)」**。 在此之前,[[Linux]] 管理 Daemon 的方式雜亂無章。`systemd` 的出現旨在平息這種混亂,並以 **標準化的規範** 管理所有系統元素。而這個標準規範,正是 **'Unit'**。 ## 3. Unit:驅動 Daemon 的「標準工作指示書」 {#sec-c8112a55b96d} 如果 Daemon 是實際執行工作的「實體」,那麼 **Unit 則是記載如何操作這些實體的「工作指示書」**。`systemd` 這個主 Daemon 會讀取我們編寫的這些指示書 (Unit),並根據其內容喚醒或停止各個 Daemon。 * **意圖明確:** 如果沒有 Unit 這個規範,每位開發者可能會以不同的方式編寫執行 Daemon 的程式碼。然而,由於有了 Unit (例如:`.service` 檔案) 這份標準指示書,我們得以非常精確且穩固地定義 **「在何種環境下、以何種順序執行,以及若發生問題應如何重新啟動」**。 * **靈活擴展:** Unit 不僅僅是為了 Daemon (Service) 而存在。它以相同的「工作指示書」格式處理 Linux 中的所有元素,例如在特定時間執行任務的「計時器 (Timer)」,或連接裝置的「掛載 (Mount)」。因此,我們可以將整個系統以一致的邏輯進行擴展。 ## 4. 關係一覽 {#sec-ea68ba1a28f7} | 分類 | Daemon | systemd Unit | | :--- | :--- | :--- | | **本質** | 在記憶體中實際運行的 **行程 (Process)** | 記錄系統設定的 **規格檔案** | | **角色** | 在背景中執行實際功能 | 定義 Daemon 的執行條件與運作方式 | | **比喻** | 在現場默默工作的 **工人** | 工人遵循的 **工作指示書** | > **總結來說:** > `systemd` 這個主 Daemon 透過讀取 **Unit (工作指示書)**,指揮眾多 **Daemon (工人)** 按照既定規則精確地運作。 ## 5. 工人身份多元:正確區分 'Daemon' 與 'Service Unit' {#sec-40ea0fcb27a7} 當我們常說「啟動服務」時,實際在背景中運行的工人 (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),才是將這些工人註冊為系統正式成員的工作指示書。 ## 結論 {#sec-5483f8db76f6} Daemon 指的是「在背景中運行的程式」這種狀態,而 Service Unit 則是將 Daemon 規範化,使其能被 `systemd` 這個主 Daemon 控制的規格說明書。正因為有這份指示書,`systemd` 才能不論工人的本質是 Python 還是二進位檔,都以相同的方式下達指令。 感覺如何呢?我以 [[Linux]] 作為主要系統已有四到五年,即使自認為已經掌握這兩者的概念,但在實際向他人解釋時卻感到非常困難。或許我以為自己懂了,但實際上並未完全理解。如今終於能用自己的語言來定義和整理,感覺思路變得清晰許多。 果然寫作是件有趣的事。儘管需要時間,但透過寫作能讓思緒更加清晰。