/etc/environment 中的环境变量不是全局可见的?

pka*_*mol 5 environment-variables systemd

我正在尝试创建一个systemd服务;

该服务有一个脚本,应该使用一些环境变量;

所以我创建了这个:

cat /etc/systemd/system/atlantis-server.service 
[Service]
ExecStart=/usr/local/bin/atlantis-server.sh
Run Code Online (Sandbox Code Playgroud)

哪个指向这个

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"
Run Code Online (Sandbox Code Playgroud)

我注意到(在我的systemd日志中出现一些错误之后)是我必须明确source /etc/environment

(这是声明上述变量的地方)。

为什么需要这个?

它们不是全局可见的吗?

编辑:将此添加到服务定义并没有解决问题

Environment=/etc/environment
Run Code Online (Sandbox Code Playgroud)

Jde*_*eBP 15

/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

进一步阅读


F1L*_*nux 5

以下内容是为了清楚地说明/etc/environment是什么/做什么、何时查阅以及什么包提供它:

whereis /etc/environment
environment: /usr/lib/environment.d /etc/environment
Run Code Online (Sandbox Code Playgroud)

根据上面的结果whereis,我们确认/etc/environment是一个SystemD文件:

sudo dpkg -S /usr/lib/environment.d
systemd, snapd: /usr/lib/environment.d
Run Code Online (Sandbox Code Playgroud)

咨询man environment.d得知/etc/environment的用途:

environment.d 目录包含用户环境的“全局”环境变量分配列表。systemd-environment-d-generator(8) 解析它们并将 systemd 用户实例导出的环境更新到它启动的服务。 ..为了向后兼容,安装了到/etc/environment 的符号链接,因此也会解析该文件。 ”