systemd-给我的服务多个参数


44

是否可以给我的systemd服务多个参数?

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

例如: ./program arg1 arg2

要启动一个参数应用程序,我需要类似systemctl start arg1@program服务定义中的内容ExecStart = /usr/bin/program ℅i

谢谢!


1
听起来您想要的是一个配置文件。
丹尼尔·B

我需要随时更改它。我严格需要一个conf文件吗?
peperunas 2014年

@peperunas,您不需要conf文件,请参阅我的答案,该文件无需任何其他文件即可工作
nonagon

Answers:


34

是的你可以!在文件的某个位置定义它们,并将它们添加到EnvironmentFile您的systemd Service中。例如,说/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


嘿,很方便,没想到这一点。我必须同意:服务参数不会定期更改,配置文件也不会更改。
Daniel B

如果服务文件使用环境变量,您可以说VAR1=... VAR2=... systemctl start foobar.service传递变量吗?
Johannes Schaub-litb 2015年

是的,我相信您可以
platforma

6
@ JohannesSchaub-litb,不,你不能。有一个PassEnvironment指令,但是它从systemd过程中获取变量(通常是PID 1),而不是systemctlsystemctl流程中的环境变量不会传播到正在启动的服务中。
cjm

2
但是新贵可以使用不同的参数运行同一服务的多个实例。例如,在eth0上的邮件服务器和在eth1上的所述邮件服务器的另一个实例,将参数传递给upstart并将其作为单独的服务进行管理。systemd可以这样做吗?
LtWorf

15

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

我使用文件名提供了服务argtest@.service请注意,当服务接受参数时,必须在末尾加上“ at sign”)。

[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并把它传递arg1arg2arg3作为单独的命令行参数来test.py.


“注意结尾的&符”:我在您的回复中没有发现&符。您可以在这一点上编辑您的答复以使其更清晰吗?
Patrick Mevzek '18

是的,对此感到抱歉!
nonagon '18 -4-5

我认为仅在您使用%I时才需要@。它是服务的一个实例。
Toby

同意,我只是碰到了一些博客文章而忽略了它。我会在回答中阐明。
nonagon '18 -4-9

这似乎无法在另一个服务中使用。我尝试过Wants=argtest@"arg1 arg2".service,只有第一个参数通过了。
罗杰·杜克

1

我最容易发现的是:

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 也可以使用这种模式作为参数。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.