systemd ExecStart、ExecStop 子句中的环境变量未按预期工作

systemd ExecStart、ExecStop 子句中的环境变量未按预期工作

我正在为一些 systemd 服务编写一些单元文件。我的一些二进制文件的路径前缀很长,它们在 ExecStart=、ExecStartPost= 和 ExecStop= 子句中被多次使用。

我定义了一些环境变量(也需要传递给服务),例如:

Environment=ORACLE_HOME=/u01/app/oracle/product/19/db_1

我相信,从 systemd.service(5) 中的“命令行”部分,我应该能够在 Exec*= 子句中使用变量扩展 - 例如:

ExecStart=${ORACLE_HOME}/bin/dbstart

当我尝试执行 systemctl daemon-reload 时,日志中出现以下错误:

systemd[1]: [/usr/lib/systemd/system/oracle.service:37] Executable path is not absolute, ignoring: ${ORACLE_HOME}/bin/dbstart /u01/app/oracle/product/19/db_1

systemd 文档相当清楚地指出,要运行的文件的路径必须以 / 开头(允许的前缀除外),但我是否遗漏了语法上的一些细微差别,使我能够做我想做的事情?

最终,我希望拥有包含所使用的环境变量的文件,以便它们可以在 systemd 单元文件中使用,也可以用于设置配置文件等。

我正在使用 RHEL7 和 RHEL8。

答案1

您可以使用环境变量,但不能将其用作命令名称。systemd.服务(5)指出

请注意,第一个参数(即要执行的程序)可能不是变量。

相关内容