Systemd:为什么不能在 ExecStart= 的第一个参数中使用 %i?

Systemd:为什么不能在 ExecStart= 的第一个参数中使用 %i?

去引用http://www.freedesktop.org/software/systemd/man/systemd.service.html#Command%lines

命令行接受“%”说明符,如 systemd.unit(5) 中所述。请注意,命令行的第一个参数(即要执行的程序)可能不包含说明符。

我刚刚遇到了一个想要这样做的用例。

为什么这不可能?有没有建议的解决方法?

答案1

根据作者本人(诗人)的说法线程:禁止,因为可能提前需要可执行文件名称(例如:SELinux 需要这个)。

但根据同一主题中的其他人以及一、有时仍然有效。

鉴于大多数说明符可以预先静态确定(模板、机器等),它最终应该得到支持。

与此同时,一个解决方案是启动一个 shell,正如问题评论和第一个帖子中所述:

ExecStart=/bin/sh -c "exec opt/%i/bin/service --args"

另一个解决方案是手动调用 ELF 解释器:

ExecStop=/lib64/ld-linux-x86-64.so.2 /usr/local/bin/%i-cli stop

/usr/bin/perl script.pl(基本上与手动运行而不是信任脚本的想法相同)

答案2

一种方法可能是使用/usr/bin/env,然后正常运行该命令。

就我而言,我想编写一个非绝对的 npm 命令:

ExecStart=/usr/bin/env npm start -- -p 2345

在你的情况下你可以做类似的事情

ExecStart=/usr/bin/env some-command/%i/bin

相关内容