我能给我的 systemd 服务提供多个参数吗?
我想执行一个具有多个参数的程序,这些参数必须由最终用户决定。
例如:./program arg1 arg2
要启动单个参数应用程序,我需要类似的内容systemctl start arg1@program
,在服务定义中我有ExecStart = /usr/bin/program ℅i
。
谢谢!
答案1
是的,你可以!在某个文件中定义它们,并将它们添加到EnvironmentFile
你的 systemd 服务中。例如,/etc/.progconf 的内容是:
ARG1=-o
ARG2=--verbose
您的 .service 文件:
EnvironmentFile=/etc/.progconf
ExecStart=/usr/bin/prog ${ARG1} ${ARG2}
如果您需要随时更改它们,可以写入该文件。服务不应频繁更改其选项,如果您需要实现这一点,也许可以考虑自动启动或 cron。
更多示例请查看:https://wiki.archlinux.org/index.php/Systemd/Services
答案2
我想做同样的事情,但不需要为每种参数组合单独创建一个文件。我发现我可以传递一个带有空格的长参数,然后使用 systemd 的环境变量空格分割功能来分隔参数。
我使用文件名创建了一个服务[email protected]
(请注意,当服务接受参数时,结尾的“at”符号是必需的)。
[Unit]
Description=Test passing multiple arguments
[Service]
Environment="SCRIPT_ARGS=%I"
ExecStart=/tmp/test.py $SCRIPT_ARGS
我用它来运行它,sudo systemctl start argtest@"arg1 arg2 arg3".service
它将和作为单独的命令行参数传递给 test.py。arg1
arg2
arg3
答案3
我发现最简单的方法是:
ExecStart=/bin/bash -c "\"/path/with spaces/to/app\" arg1 arg2 arg3 \"arg with space\""
保持一切自足。
话虽如此,我发现至少在 Ubuntu 18.04 LTS 上,我甚至不需要这样做,我可以这样做并且效果很好:
ExecStart="/path/with spaces/to/app" arg1 arg2 arg3 "arg with space"
$vars
也可以作为此模式的论据。
答案4
告诉您的用户通过使用选项创建插入式代码片段来覆盖该edit
服务系统控制。
首先,从一些合理的默认值开始。假设ExecStart
您的服务部分声明以下内容:
[Service]
ExecStart=./program arg1
现在,此服务的任何用户都可以决定是否要使用一组不同的参数来运行该程序。他们可以通过创建一个插入式代码片段来实现这一点:
systemctl edit myservice.service
在新文件中,他们只需写入以下内容来覆盖ExecStart
:
[Service]
ExecStart=
ExecStart=./program arg1 arg2
这样做的好处是最终结果不涉及修改系统安装的服务,这可能会与某些包管理器发生冲突。
就是这样!
现在只需重新加载 systemd ( systemctl daemon-reload
) 并重新启动服务 ( systemctl restart myservice.service
)。
当服务重新启动时,它也会始终加载用户的修改。
我希望这能有所帮助