是否可以在 systemd 服务文件中的另一个变量中扩展/使用变量值?

是否可以在 systemd 服务文件中的另一个变量中扩展/使用变量值?

我想要做的就是在 systemd .service 文件中重新使用我在 User= 规范中输入的名称;例如,我希望在 .service 文件中执行此操作:

# ...
User=my-username
Environment="MYPATH=/tmp/${User}"
# ...
ExecStart=/path/to/myprogram --mypath=${MYPATH}

...不幸的是,似乎你不能 - 所以我不得不多次逐字输入名称才能让某些东西正常工作:

# ...
User=my-username
#Environment="MYPATH=/tmp/${User}" # cannot use variable in a variable; write directly in ExecStart
# User= is not accessible as variable either, so define USER environment variable, and enter AGAIN "my-username" verbatim
Environment="USER=my-username"
# ...
ExecStart=/path/to/myprogram --mypath=/tmp/${USER}

我的意思是......真是一团糟;我甚至不敢相信没有任何类型的变量(不必是“环境”变量)可以在 .service 文件单位/部分中使用,但是......呃:

受支持的变量的完整列表(称为“说明符”)如下:https://www.freedesktop.org/software/systemd/man/systemd.unit.html#Specifiers

没有指定服务运行用户的主目录(由 User= 指定的目录)。用户只有一个跑步服务经理。...

%h是运行服务管理器实例的用户的主目录。对于系统管理员,此目录解析为“ /root”。

这些都是环境变量。它们不在部分中使用,而是传递给进程。在此特定情况下,它们在ExecStart(Pre|Post)? 的命令行中被引用。

Environment指令仅用于在被调用进程的环境中创建变量,而不是服务文件本身中的变量?

如何 ”为执行的进程设置环境变量。“ 还没有涵盖这个吗?

systemd 服务单元中的命令ExecStart=实际上并不在 shell 上运行,因此 shell 扩展(例如$(...)您在那里使用的命令替换)实际上不可用。

/bin/sh -c '...'您可以通过在 中明确调用 shell 脚本来使用它们ExecStartPre=

请注意,您需要$使用 来转义其本身$$,否则 systemd 将尝试将其解释为 systemd 变量扩展。

请注意,systemctl set-environment不建议使用你正在做的方式,因为你正在创建一个全球的环境变量${date}在任何地方都可用。

相反,考虑ExecStart=通过 shell 运行你的命令,在这种情况下,你可以定义一个 shell 变量${date}并只在你需要它的地方使用它:

ExecStart=/bin/sh -c 'date=$$(/bin/date ...

所以我希望至少能够做类似的事情:

# ...
User=my-username
#Environment="MYPATH=/tmp/${User}" # cannot use variable in a variable; write directly in ExecStart
# User= is not accessible as variable either, so define USER environment variable, and enter AGAIN "my-username" verbatim
Environment="USER=my-username"
# ...
ExecStartPre=/bin/sh -c 'export MYPATH=/tmp/${USER}'
ExecStart=/path/to/myprogram --mypath=${MYPATH}

...但显然ExecStartPre在其自己的进程/“子shell”中运行,并且在它存在之后,MYPATH 也未设置 - 并且似乎它甚至没有扩展${USER},因为服务状态会打印未扩展的变量:

  Process: 7165 ExecStartPre=/bin/sh -c export MYPATH=/tmp/${USER} (code=exited, status=0/SUCCESS)

因此,我发现这有点令人难以置信,我实际上不能以这种方式使用变量(或说明符) - 任何更熟悉的人都可以systemd确认,我想要在 .service 文件单元/部分(除ExecStart)中执行的变量扩展类型是否可行 -没有将调用包装ExecStart=sh -c包装器中(或设置 systemctl 全局变量)?

相关内容