Unix/Linux - 服务单元文件无法识别 /etc/environment 中设置的环境变量

Unix/Linux - 服务单元文件无法识别 /etc/environment 中设置的环境变量

我已经正确设置了环境变量/etc/environment

我已确保它通过/etc/profile修改正确加载。并且我可以回应它来确认。

但是当我为我的服务创建单元文件时,由于缺少环境变量,它失败了。但是,我可以正常地自行启动脚本。

这是我的服务单元文件:

[Unit]
Description=Zookeeper unit for this machine
AssertPathExists=/opt/kafka
[Service]
Type=simple
ExecStart=/opt/kafka/bin/zookeeper-server-start.sh /opt/kafka/config/zookeeper.properties
ExecStop=/opt/kafka/bin/zookeeper-server-stop.sh

journalctl 显示java未找到 - 但 java 通过 $JAVA_HOME 路径存在,当我直接从 bash 启动它时很容易找到它。

我不是管理员用户 :) 所以这里可能犯了一些愚蠢的错误。请问有人能给出建议吗?我应该将其添加到 system.conf 文件中并重新加载守护进程吗?

问候,

答案1

使用 Systemd,您需要明确调用带有环境变量声明的文件。例如:

[Service]
EnvironmentFile=-/etc/environment

EnvironmentFile= 行上的“-”确保如果环境文件不存在,则不会生成错误消息。由于这些文件中的许多文件在 sysvinit 中都是可选的,因此在使用此指令时应包含“-”。

此外,值得注意的是,通常有三种方法可以完成您的需要:

  1. 如上所述,将变量分配放在一个文件中(例如 /etc/environment),然后使用以下命令在每个单元中引用该文件EnvironmentFile=
  2. 在单个单元文件中引用环境变量Environment=
  3. 将变量赋值放在DefaultEnvironment/etc/systemd/system.conf 中的变量或 /etc/systemd/system.conf.d/some-file 中的代码片段中。

请查看 Fedora 关于此主题的指南,特别是EnrionmentFile 部分

相关内容