标准答案

  1. 子进程通常继承父进程环境,但服务管理器启动的进程不一定继承登录 shell 的 profile 文件。
  2. 相对路径基于当前工作目录,不是脚本文件所在目录;服务应明确 WorkingDirectory 或使用绝对路径。
  3. 排查要记录进程实际环境、命令行、工作目录和有效用户,不要只在当前终端 echo 一个变量。
  4. 敏感变量应通过受控 secret 机制注入,避免写入 unit、命令行、日志和错误报告。

题目解析

服务启动环境是一个独立的运行契约:运行用户、组、工作目录、PATH、locale、环境文件、文件权限和依赖顺序都可能与 SSH 终端不同。相对路径通常相对于服务的 WorkingDirectory,而不是代码仓库目录;依赖服务“已启动”也不等于已经可以接受请求。

排查可以用 systemd 的最终环境和执行身份复现,再检查配置文件、socket、证书、DNS 和依赖健康状态。Secret 应通过受控环境文件、凭据管理或文件挂载注入,避免出现在命令行、core dump 和启动日志中,并为缺失或格式错误配置设置快速失败。

常见误区

  • 误区:把 .bashrc 当成所有服务都会加载。改正:在服务配置或凭据管理中显式声明必要环境。
  • 误区:用相对路径访问生产配置。改正:使用明确的绝对路径或由 WorkingDirectory 约束的受控路径。
  • 误区:把 Secret 放在 ps 可见的参数里。改正:通过受控文件、环境注入或 Secret 管理服务传递,并限制读取权限。

作者信息