systemd 传递参数的语法

systemd 传递参数的语法

我如何获取当前路径作为参数?我如何将该参数传递给 ExecStart?

[Unit]
Description="xxxxxxx"

[Service]
EnvironmentFile='WORKDIR=/home/aaaa/bbbbb/' #I want to get this path dynamically when I put this in another path.
WorkingDirectory=/home/aaaa/bbbbb
ExecStart=/home/aaaa/bbbbb/server --database:/home/aaaa/bbbbb/cfg.json
ExecStop=/bin/sleep 5
KillMode=process
KillSignal=SIGQUIT
Restart=always
RestartSec=5s
LimitFSIZE=infinity
LimitCPU=infinity
LimitAS=infinity
LimitNOFILE=64000
LimitNPROC=64000
TasksMax=infinity
TasksAccounting=false

[Install]
WantedBy=multi-user.target

答案1

Systemd 不允许通过以下方式访问工作目录说明符,也不能在设置中使用环境变量WorkingDirectory。您可以在 中使用环境变量ExecStart,但不能在命令路径。因此,除非您使用变通方法,否则您必须至少指定路径三次(请注意,您想要的是Environment=,而不是EnvironmentFile=):

Environment='WORKDIR=/home/aaaa/bbbbb'
WorkingDirectory=/home/aaaa/bbbbb
ExecStart=/home/aaaa/bbbbb/server --database:${WORKDIR}/cfg.json

或者,将命令包装sh如下:

Environment='WORKDIR=/home/aaaa/bbbbb'
ExecStart=/bin/sh -c 'cd ${WORKDIR}; exec ${WORKDIR}/server --database:${WORKDIR}/cfg.json'

(希望WORKDIR其中不包含空格或其他特殊字符。)

或者,如果你将单元设为模板,你可以执行以下操作:

Environment='WORKDIR=/%I'
WorkingDirectory=/%I
ExecStart=/%I/server --database:/%I/cfg.json

并执行以下操作:

systemctl --user start my-service@home/aaaa/bbbbb.service

/请注意之前的前导斜杠%I。可执行文件的路径必须是绝对的,无论是否带有说明符,因此我们需要使用/%I

相关内容