Linux
systemd oneshot 要求只執行一次
我有多個需要生成 EnvironmentFile 的 systemd 服務。我有一個生成此環境文件的 shell 腳本,但由於在執行任何 Exec… 命令之前我需要該環境文件,因此我無法使用 ExecStartPre=generate_env_file.sh 。因此,我設置了另一個服務 (generate_env_file.service) 以一次性執行該腳本:
[Service] Type=oneshot ExecStartPre=/usr/bin/touch /path/to/config.ini ExecStart=/path/to/generate_env_file.sh
而且我有多個其他服務文件:
[Unit] Requires=generate_env_file.service After=generate_env_file.service
我如何保證兩個或多個依賴服務(需要 generate_env_file.service)不會並行執行並產生兩個 generate_env_file.service 的並行執行?
我已經研究過使用 RemainAfterExit=true 或可能使用 StartLimitIntervalSec= 和 StartLimitBurst= 來確保在某個時間段內一次只執行一個副本,但我不確定執行此操作的最佳方法。
RemainAfterExit=true
是要走的路。在這種情況下,Systemd 啟動服務並且 Systemd 認為它已啟動並處於活動狀態。但是,這不包括執行的案例systemctl restart generate_env_file.service
。在這種情況下,systemd 將重新執行您的服務。為了解決這個問題,您可以在執行文件系統中創建一個標記文件ExecStartPost=
並添加ConditionFileExists=
指令以檢查文件的存在。
ConditionFirstBoot也可能很有趣。