在 CentOS(以及大多数 Linux 发行版)里,env(环境变量)“丢失”通常不是真的被删除了,而是当前 shell 或进程没有继承到,常见原因有以下几种:
CentOS 中环境变量的加载顺序不同:
/etc/profile → ~/.bash_profile~/.bashrc✅ 典型现象:
su otheruser
echo $PATH # 比登录时少很多
✅ 解决:
su - otheruser # 加“-”模拟登录
或
source ~/.bash_profile
这些环境是最小环境:
* * * * * /opt/app/run.sh
此时:
PATHJAVA_HOME✅ 解决:
PATH=/usr/local/bin:/usr/bin:/bin
MYVAR=123
❌ 只在当前 shell ✅ 正确:
export MYVAR=123
而且:
bash script.sh)不会继承未 export 的变量CentOS 默认:
sudo 不保留所有 envsshd 可能启用 AcceptEnv 限制✅ 检查:
sudo -i # 模拟 root 登录
sudo env # 看少了多少
✅ 解决:
sudo -E(保留环境)/etc/sudoers 中配置:Defaults env_keep += "JAVA_HOME PATH"
systemd 服务 完全不读取 shell 环境
systemctl start myapp
✅ 解决:
/etc/systemd/system/myapp.service
[Service]
Environment=JAVA_HOME=/usr/java
EnvironmentFile=/etc/sysconfig/myapp
常见错误:
~/.bash_profile 但用的是 bash script.shsource✅ 建议统一放:
/etc/profile.d/myenv.sh
env
echo $PATH
cat /proc/$PID/environ | tr '\0' '\n'
CentOS 中 env“丢失”,99% 是因为 shell 类型不对(登录 / 非登录 / systemd / cron),而不是 env 被删了。
如果你愿意,可以告诉我:
我可以直接给你对应的最简解决方案。