ExecCondition 不会阻止服务启动

ExecCondition 不会阻止服务启动

我有一个带有 的服务文件ExecCondition,当使用 退出时status=1/FAILURE,不会阻止守护进程的启动。

我相信,根据文档,应该阻止守护进程启动以及阻止所有其他ExecStartPre命令运行。

当 ExecCondition= 命令以退出代码 1 到 254(含)退出时,将跳过其余命令,并且单元不会被标记为失败。

systemd.service 文档

我设置了一个每次都会以明显的方式失败的条件。ExecCondition=-sh -c 'exit(1)'

这是服务文件(为了保护无辜者而更改了名称)。

[Unit]
Description=Application
Wants=x-ray.service yankee.service zulu.service
Requires=alpha.service bravo.service
After=x-ray.service charlie.service bravo.service

[Service]
ExecCondition=-sh -c 'exit(1)'
ExecStartPre=-sh -c 'prestartShellScript.sh'
ExecStart=/opt/app/app argument1 argument2
WatchdogSec=10
Restart=always
RestartSec=10
WorkingDirectory=/opt/app
TimeoutSec=10

[Install]
WantedBy=multi-user.target

但是当我启动服务时,使用systemctl status app我看到这个显示应用程序正在运行并且其他进程也运行:

     Active: active (running) since Fri 2020-02-07 18:06:57 UTC; 6s ago
    Process: 33783 ExecCondition=/bin/sh -c exit(1) (code=exited, status=1/FAILURE)
    Process: 33796 ExecStartPre=/bin/sh -c prestartShellScript.sh (code=exited, status=0/SUCCESS)
   Main PID: 33827 (app)
      Tasks: 19 (limit: 4177)
     Memory: 101.5M
     CGroup: /system.slice/app.service
             └─33827 /opt/app/app argument1 argument2

我也改变了我ExecCondition的,ExecStartPre但我看到了同样的行为。

答案1

您的命令以 为前缀-,这是所有 Exec*= 参数中接受的通用标志,具体表示“忽略退出代码并将命令视为始终成功”。-如果您确实希望 systemd 在命令报告失败时使单元失败,请不要使用。

相关内容