为什么在 systemd 覆盖中的另一个 ExecStart=/new/value 之前使用 ExecStart= (没有值)?

kra*_*ave 9 systemd

我想采用 systemd 覆盖方式让 dockerd 监听端口 2376。所以我遵循了这个指令

另一方面,我想深入了解 systemd 以了解其幕后情况。所以我尝试通过以下命令检查 docker 的单元文件: systemctl cat docker.service

从命令的输出结果来看,涉及到两个文件。

  1. /lib/systemd/system/docker.service
  2. /etc/systemd/system/docker.service.d/override.conf

我相信第一个是 docker 的默认单元文件,第二个是我创建的。

我的问题是:两个文件都包含句子 -ExecStart=并且在第二个文件中包含两次,例如:

ExecStart=
ExecStart=/usr/bin/dockerd -H fd://
Run Code Online (Sandbox Code Playgroud)

ExecStart=在设置有意义的值之前是否有必要分配空ExecStart=/usr/bin/dockerd -H fd://

我将这篇文章分为两个问题,另一个问题在这里

lar*_*sks 23

当您将条目添加到覆盖文件时,它们默认会附加到任何现有条目。也就是说,如果您的服务example.service具有:

[Service]
EnvironmentFile=/etc/foo.env
Run Code Online (Sandbox Code Playgroud)

您可以/etc/systemd/system/example.service.d/override.conf 使用以下内容进行创建:

[Service]
EnvironmentFile=/etc/bar.env
Run Code Online (Sandbox Code Playgroud)

那么有效的配置是:

[Service]
EnvironmentFile=/etc/foo.env
EnvironmentFile=/etc/bar.env
Run Code Online (Sandbox Code Playgroud)

这对于许多指令来说都很好,但是一项服务只能有一个 ExecStart(除非它是一项Type-oneshot服务),所以如果您尝试创建一个如下所示的覆盖文件:

[Service]
ExecStart=/new/command/line
Run Code Online (Sandbox Code Playgroud)

这将失败并出现以下错误:

systemd: example.service has more than one ExecStart= setting, which is only allowed for Type=oneshot services. Refusing.
Run Code Online (Sandbox Code Playgroud)

通过指定一个 ExecStart,您将“清除”所有以前的条目。所以如果你example.service有:

[Service]
ExecStart=/bin/foo
Run Code Online (Sandbox Code Playgroud)

然后您创建一个覆盖,例如:

[Service]
ExecStart=
ExecStart=/bin/bar
Run Code Online (Sandbox Code Playgroud)

有效的配置是:

[Service]
ExecStart=/bin/bar
Run Code Online (Sandbox Code Playgroud)

  • 谢谢你的解释。非常清楚。:) (2认同)