我有一个带有 的服务文件ExecCondition
,当使用 退出时status=1/FAILURE
,不会阻止守护进程的启动。
我相信,根据文档,应该阻止守护进程启动以及阻止所有其他ExecStartPre
命令运行。
当 ExecCondition= 命令以退出代码 1 到 254(含)退出时,将跳过其余命令,并且单元不会被标记为失败。
我设置了一个每次都会以明显的方式失败的条件。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 在命令报告失败时使单元失败,请不要使用。