systemd - 为我的服务提供多个参数

pep*_*nas 63 linux systemd

是否可以为我的 systemd 服务提供多个参数?

我想执行一个带有多个参数的程序,这些参数必须由最终用户决定。

例如: ./program arg1 arg2

要启动一个单参数应用程序,我需要类似的东西systemctl start arg1@program,在服务定义中我有ExecStart = /usr/bin/program ?i.

谢谢!

ale*_*exm 52

是的你可以!将它们定义在某个文件中并将它们添加到EnvironmentFile您的 systemd 服务中。例如,假设 /etc/.progconf 的内容是:

ARG1=-o
ARG2=--verbose
Run Code Online (Sandbox Code Playgroud)

还有你的 .service 文件:

EnvironmentFile=/etc/.progconf
ExecStart = /usr/bin/prog $ARG1 $ARG2
Run Code Online (Sandbox Code Playgroud)

如果您需要随时更改它们,您可以写入该文件。服务不应该经常更改其选项,如果需要,可以考虑自动启动或 cron。

有关更多示例,请查看:https : //wiki.archlinux.org/index.php/Systemd/Services

  • @JohannesSchaub-litb,不,你不能。有一个 `PassEnvironment` 指令,但它从 `systemd` 进程(通常 PID 1)中获取变量,而不是从 `systemctl` 中获取。来自“systemctl”进程的环境变量不会传播到正在启动的服务。 (7认同)
  • 但是 upstart 可以使用不同的参数运行同一服务的多个实例。例如 eth0 上的邮件服务器和 eth1 上所述邮件服务器的另一个实例,将参数传递给 upstart 并将它们作为单独的服务进行管理。systemd 能做到吗? (2认同)

non*_*gon 36

我想做同样的事情,但没有为每个参数组合创建单独的文件。我发现我可以用空格传递一个长参数,然后使用 systemd 的环境变量空间分割功能来分隔参数。

我创建了一个带有文件名的服务argtest@.service注意当服务接受参数时需要尾随的“at 符号”)。

[Unit]
Description=Test passing multiple arguments

[Service]
Environment="SCRIPT_ARGS=%I"
ExecStart=/tmp/test.py $SCRIPT_ARGS
Run Code Online (Sandbox Code Playgroud)

我运行sudo systemctl start argtest@"arg1 arg2 arg3".servicearg1,它通过,arg2arg3作为单独的命令行参数传递给 test.py。

  • 在我的 debian 上,我得到“无效的单元名称“argtest@arg1 arg2.service”被转义为“argtest@arg1\x20arg2.service”(也许您应该使用 systemd-escape?)” (3认同)

jjx*_*tra 7

我发现的最简单的是:

ExecStart=/bin/bash -c "\"/path/with spaces/to/app\" arg1 arg2 arg3 \"arg with space\""
Run Code Online (Sandbox Code Playgroud)

保持一切独立。

话虽如此,我发现至少在 Ubuntu 18.04 LTS 上,我什至不需要这样做,我可以这样做,而且效果很好:

ExecStart="/path/with spaces/to/app" arg1 arg2 arg3 "arg with space"
Run Code Online (Sandbox Code Playgroud)

$vars也可以作为此模式的参数。