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

/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

答案1

/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

进一步阅读

答案2

以下内容是为了澄清什么/etc/环境is/does,当它被查询时以及哪个包提供它:

whereis /etc/environment
environment: /usr/lib/environment.d /etc/environment

结合上面的结果whereis,我们确认/etc/环境是一个系统D文件:

sudo dpkg -S /usr/lib/environment.d
systemd, snapd: /usr/lib/environment.d

咨询后man environment.d得知目的/etc/环境:

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

答案3

正如您从前面的答案中看到的那样 - Systemd 在启动服务时不会获取该文件。

将其添加到服务定义中并没有解决问题

Environment用于环境变量的内联定义(例如Environment=KEY1=Value1)。要从文件中读取,请使用EnvironmentFile指令。指向的文件EnvironmentFile应采用以下格式:

Key1=Value1
Key2=Value2

它不应该包含任何外壳替换或者变量插值因为 Systemd 不是 shell,无法正确处理该信息。

答案4

不,环境变量是每个线程的属性,因此不是全局可见的,只是从某些父进程或祖父进程继承。 Systemd 在启动系统服务时不会读取该文件。

相关内容