我想要做的就是在 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://serverfault.com/q/794922/how-to-use-the-home-environment-variable-in-systemd-service-files
受支持的变量的完整列表(称为“说明符”)如下: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 全局变量)?