Systemd

/etc/environment 中的環境變數不是全域可見的?

  • December 14, 2021

我正在嘗試創建systemd服務;

該服務有一個腳本,它應該使用一些環境變數;

所以我創建了這個:

cat /etc/systemd/system/atlantis-server.service 
[Service]
ExecStart=/usr/local/bin/atlantis-server.sh

這表明了這一點

pkara@atlantis-server:~$ cat /usr/local/bin/atlantis-server.sh 
#!/bin/bash
source /etc/environment
atlantis server --atlantis-url="$URL" --gitlab-user="$USERNAME" --gitlab-token="$TOKEN" --gitlab-webhook-secret="$SECRET" --gitlab-hostname="$HOSTNAME" --repo-whitelist="$REPO_WHITELIST"

我注意到(在我的systemd日誌中出現一些錯誤之後)是我必須明確source /etc/environment

(這是聲明上述變數的地方)。

為什麼需要這個?

它們不是全球可見的嗎?

編輯:將此添加到服務定義中並沒有解決問題

Environment=/etc/environment

/etc/environment不是全域配置文件。

它僅適用Linux;僅限於 PAM 會話,由login等使用;並且在系統上安裝並啟用了特定 PAM 外掛的情況下,並且該 PAM 外掛尚未配置為使用其他文件(因為/etc/environment如果沒有另行通知,它只是其預設值)。讀取它的是 PAM 外掛。

否則,它只是一個沒有/etc任何用途的無意義文件。

雖然您可以在 中全域設置環境變數systemd-system.conf,但這適用於所有服務,而不僅僅是您想要更改的服務。

類似地,雖然EnvironmentFile在適當的服務單元中是一種讓 systemd 讀取具有環境變數定義列表的公共文件的方法,但 systemd 人員不鼓勵使用它。他們認為EnvironmentFile這是一個壞主意,使用它是一個錯誤。

根據 systemd 人員執行此操作的正確方法是使用設置設置服務單元中的每個變數,該Environment設置包含要設置的實際環境變數名稱和值,而不是文件名。這可以直接在相關的服務單元中,如果在這裡編寫自己的服務單元來放置/etc;或者在一個.conf覆蓋文件中,如果一個人正在調整一個預先打包的服務單元,/lib或者/usr/lib

進一步閱讀

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