如果它們是通過 systemctl 以外的機制啟動的,systemctl 無法準確報告守護程序的狀態
有兩種機制可以啟動/停止我的程序“abc”
- /usr/lib/systemd/system/abc.service 中的 systemctl 服務文件
- /etc/abc init script abc script 將呼叫所有守護程序。但是當我使用 /etc/abc 啟動/停止守護程序時,systemctl 狀態不准確
為了解決這個問題,我添加了 Type=forking 並添加了 PIDFile 指令。它解決了停止的問題。當我使用 abc init 腳本停止守護程序時,systemctl 狀態將顯示為非活動狀態。所以問題得到了部分解決。但是當我使用 abc init 腳本啟動守護程序時,它仍然處於非活動狀態。
我該如何解決這個問題?我嘗試引入一個 abc.path 文件,該文件檢查文件是否存在,然後通知服務。但這沒有幫助。
使用 systemd 219。
當然可以。
如果它們不是由服務管理子系統啟動的,它們將不會被服務管理子系統跟踪。他們不會是真正的守護程序,真的。
van Smoorenburg
rc
兼容性機制的背景進一步閱讀: https ://unix.stackexchange.com/a/233581/5132
systemd 提供的 van Smoorenburg
rc
兼容機制是一個生成器。它確保有一個生成abc.service
的服務/etc/init.d/abc start
在服務啟動和/etc/init.d/abc stop
服務停止時執行。請注意,在這一點上,存在
/usr/lib/systemd/system/abc.service
完全阻止了abc.service
systemd 的生成器的生成。
rc
這是vanilla systemd中 van Smoorenburg 兼容性的全部範圍。超級使用者以各種方式直接呼叫/etc/init.d/abc
並連接到 systemd 的能力是作業系統的個人開發人員 對 vanilla systemd 的增強。例如,Debian 和 Ubuntu 人員在他們自己的子系統中提供了一個鉤子,
/lib/lsb/init-functions.d/
其作用如下:
- 如果鉤子檢測到
init.d
腳本作為生成的 systemd 服務的 ExecStart/ExecStop 被呼叫,它不會做任何特別的事情,只是按原樣執行腳本的其餘部分。- 如果鉤子檢測到
init.d
腳本被直接呼叫,而不是作為生成的 systemd 服務的一部分,它會轉換並切換到該腳本,而不執行腳本的其餘部分。(它通過的一些動詞,但你說的是and ,它們的處理方式是這裡解釋的。)/etc/init.d/*name* *verb*``systemctl *verb* *name*``start``stop
在沒有兼容機制的情況下
並非所有作業系統都具有這種 van Smoorenburg
rc
兼容性機制,可以將直接呼叫轉換為 systemd 的處理方式。某些作業系統(例如,由“為什麼init 0
會導致 Arch 安裝時出現“多餘的參數”? ”中的人執行的作業系統)根本不提供 van Smoorenburg兼容性,不提供像 Debian’s/ 這樣的鉤子。 Ubuntu 甚至完全禁用了 vanilla systemd 附帶的兼容性機制。/etc/init.d/*name* *verb*``rc
在這樣的作業系統上,
rc
直接執行 van Smoorenburg 腳本只是按原樣執行該腳本。這樣的腳本不會啟動服務管理下的服務。它做諸如雙重分叉之類的事情,徒勞無功,在大多數情況下,嘗試在實際服務守護程序執行的相同環境中執行是徒勞的。(許多所謂的“dæmonization”東西不起作用,也沒有起作用自 1980 年代以來;這就是在 1990 年代初期發明了適當的守護程序管理系統的原因。)但就服務管理而言,它只是互動式登錄會話中的超級使用者分叉的東西。
事實上,systemd 會考慮直接呼叫 van Smoorenburg
rc
腳本和所有它們派生到後台的徒勞的“dæmonized”程序,作為使用者切片內使用者互動式會話範圍的一部分執行,而不是作為與使用者一起執行的服務系統片中的會話。更糟糕的是,它最終使用了 van Smoorenburg
rc
系統存在嚴重缺陷的機制,例如在服務停止時殺死所有執行與服務名稱匹配的程序,而**不僅僅是服務管理器啟動並正在跟踪的特定服務程序。這就是為什麼看起來對你有用。該腳本正在殺死與名稱匹配的所有程序,這恰好還包括在服務管理器下執行的程序。然而,這種不分青紅皂白地殺死一切是一個錯誤,而不是一個功能。這只是正常功能的外觀,它會/etc/init.d/*name* stop
咬你一口,因為它在過去幾十年裡咬了這麼多系統管理員。正確的做法
如果您缺乏此類兼容性機制,請不要
rc
直接呼叫 van Smoorenburg 腳本。它是如此簡單。使用service
orsystemctl
命令與 systemd 的服務管理進行通信;但不要直接執行來停止、啟動和獲取服務的狀態。/etc/init.d/*anything*
次要的一點是,您不應該只是
/usr/lib/systemd/system/abc.service
為了嘗試使 van Smoorenburgrc
腳本進入某種工作而四處亂竄。Type=forking
幾乎可以肯定您的服務是錯誤的。(它與野外幾乎所有的實際服務都不匹配。)如果想出的人/usr/lib/systemd/system/abc.service
設法擺脫對真正的服務管理完全沒有必要的眾所周知的被破壞的 PID 文件機制,它再把它放回去是完全愚蠢的。進一步閱讀
- 喬納森·德博因·波拉德 (2015)。Unix 守護程序的就緒協議問題。經常給出答案。
- 喬納森·德博因·波拉德 (2015)。“繼承與惡魔化謬誤”。“服務”命令不再有問題。點心。JdeBP 的軟體。
- 喬納森·德博因·波拉德 (2001)。 設計 Unix 守護程序時要避免的錯誤。經常給出答案。
- https://unix.stackexchange.com/a/200365/5132
- systemd 如何確定服務已停止?
- 服務與 systemctl 腳本——使用哪個