我需要覆盖systemd模板的ExecStart
参数。我已确认单元文件存在并通过验证。添加[email protected]/override.conf
文件在某些机器上效果很好:
user@prod-west-1604$ systemctl --version | head -1
systemd 229
user@prod-west-1604$ file -b /etc/systemd/system/[email protected]
symbolic link to /lib/systemd/system/nginx.service
user@prod-west-1604$ sudo systemctl edit [email protected]
# (opens editor as expected)
但是,在运行较新 systemd 版本的机器上,操作会失败:
user@prod-east-1810$ systemctl --version | head -1
systemd 239
user@prod-east-1810$ file -b /etc/systemd/system/[email protected]
symbolic link to /lib/systemd/system/nginx.service
user@prod-east-1810$ sudo systemctl edit [email protected]
Failed to get the load state of [email protected]: Unit name [email protected] is neither a valid invocation ID nor unit name.
为什么?
这是由v233 中引入并在 v240 中修复的systemd错误引起的。没有必要升级systemd,在大多数情况下
systemctl edit
,这只不过是以下的捷径:覆盖文件将起作用,即使在该命令不起作用的systemd版本中也是如此。
systemctl edit
不要忘记使用以下方法应用新配置:启动服务失败时,我收到了关于“既不是有效的调用 ID 也不是单元名称”的相同错误消息,但修复与接受的答案不同并且与错误无关。正如我在下面解释的那样,错误消息是一个完全的红鲱鱼和浪费时间。
我的问题是 systemd
netfilter-persistent
服务。该错误消息使我相信 systemd-gears 启动服务存在问题。然后我顿悟了:如果服务调用的“ rules.v4iptables
”中有一个 duff规则怎么办?是的:服务没有启动,因为需要一个依赖文件来提升它,在这种情况下,“ rules.v4 ”有一个错误。这没有出现在
systemctl status
orjournalctl -xe
中。sed 表达式无法匹配并用子网替换占位符。一旦我正确构建了规则文件,服务就会正确启动。在调查此错误消息时,不要盲目地查看 systemd 服务定义本身,以至于您不会查看任何可能出现错误的依赖文件被调用。
Anyhoo,希望这可以避免其他人使用此错误消息追赶他们的尾巴。