Systemd
/etc/environment 中的環境變數不是全域可見的?
我正在嘗試創建
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/a/419061/5132
- Lennart Poettering 等人。(2016 年)。
systemd-system.conf
. systemd 手冊頁。自由桌面.org。- Lennart Poettering 等人。(2016 年)。
systemd.exec
. systemd 手冊頁。自由桌面.org。- Andrew G. Morgan 和 Thorsten Kukuk(2010 年 8 月)。“ pam_env — 設置/取消設置環境變數”。 Linux-PAM 系統管理員指南。linux-pam.org。