systemd oneshot 要求只执行一次

5 linux startup systemd

我有多个需要生成 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
Run Code Online (Sandbox Code Playgroud)

我还有多个其他服务文件,它们具有:

[Unit]
Requires=generate_env_file.service
After=generate_env_file.service
Run Code Online (Sandbox Code Playgroud)

我如何保证两个或多个依赖服务(需要 generate_env_file.service)不会并行运行并生成 generate_env_file.service 的两个并行执行?

我已经考虑过使用 RemainAfterExit=true 或可能使用 StartLimitIntervalSec= 和 StartLimitBurst= 来确保在某个时间段内一次只执行一个副本,但我不确定这样做的最佳方法。

小智 5

RemainAfterExit=true是要走的路。在这种情况下,Systemd 启动服务,Systemd 认为它已启动并处于活动状态。但是,这并不涵盖执行systemctl restart generate_env_file.service. 在这种情况下,systemd 将重新执行您的服务。为了解决这个问题,你可以在运行文件系统中创建一个标记文件ExecStartPost=并添加ConditionFileExists=指令来检查文件的存在。