
使用 SystemD,我如何使某些服務依賴某些網路介面的啟動?
例如,假設我有一個 802.1ad 綁定接口,在啟動之前我需要等待訪問我的 SAN/NAS libvirtd
,即使我可以透過不同的接口進行網路存取。或者假設我有一個sshfs
安裝座,我想根據 VPN 連線自動啟動(並自動拆除)?
處理網路介面的細粒度依賴關係的慣用方法是什麼?
目前,我在 Ubuntu 和 CentOS7 上使用 NetworkManager,但我對其他適合平台的網路狀態管理機制持開放態度。
答案1
我認為並沒有真正建立的標準,但是您可以在systemd
.
分別在 ExecStart= 中的命令之前執行的附加命令。語法與 ExecStart= 相同,不同之處在於允許多個命令列,並且命令按順序一個接一個地執行。
如果這些命令中的任何一個(不帶“-”前綴)失敗,則其餘命令不會執行,並且該單元被視為失敗。
配置當服務進程退出、終止或逾時時是否重新啟動服務。
如果設定為 on-failure,當進程以非零退出代碼退出、被訊號終止(包括核心轉儲,但不包括上述四個訊號)、當某個操作(例如服務reload) 逾時,以及觸發配置的看門狗超時時。
如果命令返回非零退出代碼,則被認為失敗,因此透過設定ExecStartPre
來證明您的介面已啟動,您可以確保您的服務將需要它。
一些例子:
ExecStartPre=/usr/bin/ping -c 1 ${SAN_IP}
ExecStartPre=/usr/sbin/iscsiadm -m session
我個人喜歡iscsiadm
您的用例的變體。如果存在iscsi連線則傳回值為0,否則傳回21(這將導致服務失敗)。該ping
變體可以用於更廣泛的用途,但我想說在大多數情況下您可能需要找到更合適的命令來檢查網路狀態。ssh
如果您設定了金鑰來檢查另一台主機上的內容,您甚至可以嘗試使用。
重點是ExecStartPre
可以讓您根據任何命令使服務失敗。只需檢查以確保您使用的任何命令都會在您需要時返回非零退出代碼(例如cat
ing 空文件返回 0,而cat
ing 不存在的文件返回 1)
經過一番考慮和提問者的評論後,我會說最好的為服務定義複雜條件的方法是建立另一個服務以供其依賴。
建立一個新服務,使用該命令檢查狀態ExecStart
。給它Restart=on-failure
。然後製作你原來的服務Require
就After
可以了。
我上面使用的範例ExecStartPre
有點扭曲了其最初的目的,即為服務正常運行進行設定。它仍然可以應用,並且知識仍然有用,所以我將其完好無損地保留下來。