systemd 可以在重新啟動後保留其狀態嗎?

systemd 可以在重新啟動後保留其狀態嗎?

我正在建立一個 Linux 伺服器,該伺服器將有數十個由 systemd 控制的守護程式。守護程序被分組為目標,以便可以按群組啟動和關閉它們,但係統管理員可以手動控制各個服務。我正在尋找一種透過重新啟動來保留狀態(啟動哪些服務)的方法。這個想法是,人們在伺服器上進行偵錯、測試和開發時可以根據需要重新啟動伺服器,並使系統的配置與重新啟動前相同。

systemd 的snapshot功能似乎對此很理想,但據我所知,您無法將快照寫入磁碟以供以後使用。

我最初的計劃是建立一個multi-user.target.wants/指向名為 的服務的符號連結bootingup.service。系統管理員啟動的每個目標都會重寫bootingup.service.d/bootingup.conf以啟動剛剛啟動的目標。這意味著系統在啟動時將啟動最近啟動的目標,但它不會記住任何單獨啟用/停用的服務。

有沒有辦法讓 systemd 在重新啟動後記住所有服務的狀態?

答案1

我將從以下開始回答這個問題:

我建議您強制開發人員在服務中正確使用enabledisableafter和等內容,而不是對正在運行的內容進行轉儲和恢復。wantssystemd

現在我已經把它從我的系統中刪除了...


systemctl snapshot可以幫助您做您正在尋找的事情。

運行時systemctl snapshot ${SNAPSHOT_NAME} systemd會建立一個名為 的單元${SNAPSHOT_NAME}.snapshot。這個單位似乎只存在於記憶中。但是,您仍然可以使用 來查詢它systemctl

使用systemctl show ${SNAPSHOT_NAME}.snapshot將列出為快照收集的所有信息systemd,特別值得注意的是Wants=/After=部分(兩者似乎相同),其中列出了快照時處於活動狀態的所有單元。如果您要解析該列表並將其放入自訂目標中,您可以使用systemctl isolate ${CUSTOM_TARGET}.

systemctl 隔離

啟動命令列上指定的單元及其相依性並停止所有其他單元。如果給予的單元名稱沒有副檔名,則將假定副檔名為「.target」。

這類似於更改傳統 init 系統中的運作等級。 isolate 指令將立即停止新設備中未啟用的進程,可能包括您目前正在使用的圖形環境或終端機。

請注意,僅在啟用了AllowIsolate=的裝置上才允許這樣做。有關詳細信息,請參閱 systemd.unit(5)。

${CUSTOM_TARGET} Wants您甚至可以編寫一個在關閉時更新/部分的服務After

答案2

我認為你應該使用像 Puppet 或 Ansible 這樣的設定管理器來做到這一點,設定管理器是讓你的系統保持你想要的方式的最佳方式。 Systemd 快照在重新啟動後不會保留。

相關內容