Linux

systemd ExecStart、ExecStop 子句中的環境變數未按預期工作

  • April 8, 2022

我正在為一些 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。

您可以使用環境變數,但不能作為命令名稱。systemd.service(5)的“命令行”部分指出

請注意,第一個參數(即要執行的程序)可能不是變數。

引用自:https://serverfault.com/questions/1098159