為什麼大多數 systemd 範例都包含 WantedBy=multi-user.target?
我已閱讀什麼是 multi-user.target和systemd 文件,其中指出 multi-user.target 是一個特殊目標。此外,許多systemd 範例都包含該行。
- 為什麼這麼多範例服務包含該行?
- 如果它們不包含 WantedBy=multi-user.target 會發生什麼?
- 你能給我一個例子,說明什麼時候實際上不建議將該行包含在服務文件定義中?
- 同樣,什麼時候保留這條線是個好主意?
1.)
multi-user.target
基本上是最接近經典 SysVinit 執行級別 3 的等價物systemd
。當systemd
系統啟動時,systemd
試圖使系統狀態與default.target
- 指定的狀態相匹配,這通常是graphical.target
或的別名multi-user.target
。
multi-user.target
通常定義一個系統狀態,其中所有網路服務都已啟動並且系統將接受登錄,但未啟動本地 GUI。這是伺服器系統的典型預設系統狀態,可能是遠端伺服器機房中的機架式無頭系統。
graphical.target
是另一個可能的別名default.target
。通常它被定義為 的超集multi-user.target
:它包括所做的一切multi-user.target
,以及本地 GUI 登錄的啟動。有點像經典 SysVinit 中的執行級別 5。服務中的行
WantedBy=multi-user.target
本質上與在 SysVinit 系統中指定“此服務應在執行級別 3、4 和 5 中啟動”相同:它systemd
表明該服務應作為正常系統啟動的一部分啟動,無論是否本地GUI 處於活動狀態。但是,
WantedBy
它與啟用/禁用狀態是分開的:所以在另一種意義上,它是一種“預設”:它決定了在什麼條件下可能會發生自動啟動,但僅限於首先啟用服務時。2.) 如果您省略該
WantedBy=multi-user.target
行並且沒有其他啟用的服務在其服務定義中包含Requires=your.service
或Wants=your.service
,您的服務將不會自動啟動。
systemd
適用於依賴項,並且在啟動時,如果沒有任何內容Requires
或Wants
您的服務,即使啟用了該服務,它也不會啟動。當然,您可以編輯您
default.target
的添加或刪除Requires
或Wants
任何您希望在啟動時啟動的服務的行 - 但這樣您就可以將一個新的服務文件放入系統並使其預設工作(這使得軟體非常容易包管理器),systemd
具有WantedBy
andRequiredBy
關鍵字,可用於從“另一端”插入Wants
和Requires
鍵入依賴項(分別)。3.) 如果您不希望該服務在啟動時自動啟動,或者該服務是您明確定義的依賴鏈的一部分,您應該省略該行。
例如,您可能正在重構伺服器應用程序 A,並且出於某種原因決定將一些可選功能從它拆分為單獨的服務 B,以允許使用者在不需要時選擇不安裝它。然後,您可以使服務 B 成為單獨的
service-B.rpm
,並定義B.service
withWantedBy=A.service
以systemd
在服務 A 啟動時自動啟動服務 B - 但僅在service-B.rpm
實際安裝時。請注意,a
Wants
orWantedBy
僅表示系統應該在另一個服務或目標也啟動時啟動一個服務,但它根本沒有指定啟動/關閉順序。如果您需要在服務 A 啟動時服務 B 已經在執行,則需要Before=A.service
在B.service
文件中添加以明確指定啟動順序依賴項。4.) 任何時候您確實希望服務能夠在啟動時自動啟動,並且沒有其他依賴項已經定義。