Debian

是否可以為某些服務導出環境變數?

  • August 2, 2018

說我有兩個服務,它們是在系統(Ubuntu 16.04.3)啟動時自動啟動兩個程序。

一份服務文件:

[Unit]
Description=service 1
Requires=init_mdc.service
After=rc.local.service init_mdc.service


[Service]
ExecStart=someCmd
ExecReload=someCmd
KillMode=process
Restart=on-failure
Type=simple

另一個服務文件:

[Unit]
Description=service 2
Requires=init_mdc.service
After=rc.local.service init_mdc.service


[Service]
ExecStart=someCmd2
ExecReload=someCmd2
KillMode=process
Restart=on-failure
Type=simple

這兩個服務需要一些相同的環境變數。

目前我的解決方案並不好,因為這someCmd兩個服務的 s 是兩個不同的 bash 腳本,我在其中設置了相同的 env 變數。

我在想是否可以以某種方式在某個地方設置一些環境變數,以便兩個服務可以共享它們,換句話說,我只想設置環境變數一次,而不是兩次。

我試圖從/etc/profile, from導出這些環境變數/etc/rc.local,但它們不起作用。我認為這是因為系統先執行我的兩個服務,然後再/etc/profile/etc/rc.local系統讀取。

有沒有辦法讓我為多個服務文件設置一些環境變數?我知道我們可以在服務文件中設置導入一些環境變數,但我不喜歡這樣,因為我仍然需要為每個服務服務EnvironmentFile=XXX設置多次…EnvironmentFile=XXX

使用EnvironmentFile=是要走的路。

我不明白您必須多次設置它的意思…您必須從需要這些變數的每個服務中設置一次…

服務一:

[Unit]
Description=service 1

[Service]
ExecStart=someCmd
EnvironmentFile=/path/to/common.env
...

服務二:

[Unit]
Description=service 2

[Service]
ExecStart=someCmd2
EnvironmentFile=/path/to/common.env
...

並將所有VAR=VALUE設置保存在文件中/path/to/common.env

環境文件的語法與 shell 腳本的語法兼容,因此您甚至可以在您的.bash_profile

# ~/.bash_profile
if [ -f /path/to/common.env ]; then
   . /path/to/common.env
fi

一種替代方法是在 PID 1 中使用systemctl set-environmentsystemctl import-environment設置全域環境變數。(請參閱此處的文件。)

您可能仍需要PassEnvironment=在特定服務中導出這些變數,但在這種情況下,您只需列出變數名稱。

我真的不認為這是最好的解決方案,但我認為EnvironmentFile=它更加獨立、優雅且適合您的案例。

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