systemd 拒绝“多个 ExecStart= 设置”

raj*_*jee 12 systemd redis

我正在尝试为 redis 编写一个 systemd 服务文件。

这是我的文件:

[Unit]
PartOf=smp-data-services.target
Description=Redis persistent key-value database
After=network.target

[Service]
ExecStart=/opt/eg/share/redis/bin/redis-server
ExecStop=/opt/eg/share/redis/bin/redis-cli
Restart=on-failure
User=eg
Group=eg

[Install]
WantedBy=multi-user.target
Run Code Online (Sandbox Code Playgroud)

无论我做什么,我都不断得到:

# systemctl daemon-reload

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

我可以在命令行上启动 redis,没有像这样的问题:

/opt/eg/share/redis/bin/redis-server
Run Code Online (Sandbox Code Playgroud)

我读过 redis 的守护进程分叉过程是非标准的,我应该避免 Type=forking 或 oneshot。

小智 9

波纹管 [服务] 你应该清理 ExecStart 命令

[Unit]
PartOf=smp-data-services.target
Description=Redis persistent key-value database
After=network.target

[Service]
ExecStart=
ExecStart=/opt/eg/share/redis/bin/redis-server
ExecStop=/opt/eg/share/redis/bin/redis-cli
Restart=on-failure
User=eg
Group=eg

[Install]
WantedBy=multi-user.target
Run Code Online (Sandbox Code Playgroud)

  • 即使对于插入文件也必须完成“清理”`ExecStart`,我只是点击了它。上面的解决方案有效。 (3认同)
  • 这有效,但也太违反直觉了! (2认同)
  • 为什么这有效?首先,可以存在多个`ExecStart=`。这就引出了一个问题,即之前设置的位置,因为它不在这个单元文件中,但可能以某种方式默认设置。接下来来自文档“如果将空字符串分配给此选项,则要重置的命令列表将重置,此选项的先前分配将无效。” (2认同)

raj*_*jee 4

感谢拉劳恩扎他是对的。我在 /etc/systemd/system/redis.service.d/redis_systemd.conf 中有一个 .conf 文件。一旦我删除它,它就几乎可以工作了!