Linux

systemd oneshot 要求只執行一次

  • November 8, 2017

我有多個需要生成 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也可能很有趣。

引用自:https://unix.stackexchange.com/questions/320400