You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Linux Systemd Unit服务无法读取.env文件中的特定环境变量

问题根因与解决方案

核心原因

  1. godotenv.Load() 默认读取程序运行时的当前工作目录下的 .env 文件,而非二进制文件所在目录的配置文件。你使用 go run . 时是在项目根目录 /home/mert/certprovider 下执行命令,会加载项目目录下的完整 .env,因此所有变量读取正常。
  2. 你当前的systemd service配置中,WorkingDirectory 被设置为 /home/mert,程序运行时会优先读取该目录下的 .env 文件。大概率该目录下的 .env 已配置了CA地址、邮箱等变量,但未配置PORT/APP_PORT,所以才会出现其他变量读取正常、仅端口变量缺失的问题。
  3. 当你在unit文件中通过Environment参数直接设置环境变量时,环境变量优先级高于.env文件配置,因此可以正常读取。

修复方案

任选以下一种方案即可:

  • 调整systemd的工作目录为项目根目录,修改service配置中的WorkingDirectory值:
    WorkingDirectory=/home/mert/certprovider
    
    修改完成后执行以下命令重启服务生效:
    systemctl daemon-reload
    systemctl restart <你的服务名称>.service
    
  • 在Go代码中指定.env文件的绝对路径,避免依赖运行时工作目录:
    // 替换为你的.env文件实际存放的绝对路径
    err := godotenv.Load("/home/mert/certprovider/.env")
    if err != nil {
        log.Fatalln("Error loading .env file")
    }
    
  • 将项目根目录下的完整.env文件移动到/home/mert目录下,覆盖现有不全的配置文件即可。

内容的提问来源于stack exchange,提问作者Mert Simsek

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.25 21:54:04