Environment-Variables

systemd:環境變數的預設值

  • November 16, 2015

我想將一些 OpenRC 初始化腳本遷移到 systemd,但我認為這是 systemd 中環境變數處理的一般問題。

原始 OpenRC 文件

有一個文件,例如/etc/conf.d/fooservice內容

# FOO 變數的值
# 你可以通過取消註釋這一行來覆蓋預設值
# FOO=值1

# BAR 變數的值
BAR=值2

在原始啟動腳本/etc/init.d/fooservice中,有

FOO=${FOO:-default_foo_value}
BAR=${BAR:-default_bar_value}

所以結果$FOO==default_foo_value$BAR==value2

遷移的 systemd 文件

現在我有 systemd 服務文件/usr/lib/systemd/system/fooservice.service,其中包含

[服務]
EnvironmentFile=/etc/conf.d/fooservice
ExecStart=/usr/bin/fooservice $FOO $BAR

但是有一個問題$FOO是沒有初始化為default_foo_value

如果環境文件中沒有值,有沒有辦法告訴 systemd 使用預設值?有沒有辦法使用具有預設值或多個連結環境文件的中間環境文件?

解決方案:

這不是好辦法。/etc/conf.d/fooservice文件可能不兼容,因為它是“shell 腳本”並且 systemd 需要“環境文件”。在基本的賦值中,看起來很相似,但又不是一回事。

Gentoo 對此的首選解決方案是將所有內容放入服務文件和服務配置文件中,而不是使用附加conf.d文件。

工作但不是首選的解決方案:

僅使用它作為 systemd 執行 OpenRC 服務的快速 hack。

/usr/lib/systemd/system/fooservice.service現在包含

[服務]
環境="FOO=default_foo_value"
環境="BAR=default_bar_value"
EnvironmentFile=/etc/conf.d/fooservice
ExecStart=/usr/bin/fooservice $FOO $BAR

systemd 不是 shell,因此它不支持環境文件中特定於 shell 的替換。它們的格式很簡單KEY=VALUE,中間可能有空行和註釋。

引用systemd.exec(5)

這些文件中的設置會覆蓋使用 Environment= 所做的設置。如果從這些文件中設置了兩次相同的變數,則將按照指定的順序讀取文件,後面的設置將覆蓋前面的設置。

因此,您可以通過以下任一方式完成您的任務:

  • 使用多個EnvironmentFile=指令(它們按照規範的順序相互覆蓋)
  • Environment=在服務文件中使用來指定預設值(任何EnvironmentFile=將覆蓋它)

引用自:https://unix.stackexchange.com/questions/174816