温馨提示×

CentOS env如何继承父进程

小樊
34
2026-08-04 13:41:00
栏目: 智能运维

CentOS(以及所有 Linux) 中,子进程默认就会继承父进程的环境变量,这是操作系统的行为,不是 CentOS 特有的。下面分几种常见情况说明。


一、环境变量是如何继承的

1️⃣ 默认行为(最重要)

子进程会自动继承父进程的 environment(环境变量)

例如:

# 父进程
export VAR1=hello
bash        # 启动子进程

# 子进程中
echo $VAR1
# 输出 hello

✅ 原因:
export 会把变量放进 environment,子进程 fork 时会继承。


二、哪些变量会被继承

✅ 会被继承

  • 使用 export 导出的变量
  • 使用 env / printenv 能看到的环境变量
export PATH=/usr/local/bin:$PATH

❌ 不会继承

  • 普通 shell 变量(未 export)
  • 函数(除非显式导出)
VAR2=world   # 不会继承
bash
echo $VAR2   # 空

三、CentOS 中常见的继承场景

1️⃣ Shell 启动子进程

bash
sh
su
sudo

✅ 继承父 shell 的环境变量
⚠️ 但 su / sudo 可能会重置环境(见下文)


2️⃣ systemd 服务(重点)

❌ systemd 服务 不会 继承当前 shell 环境

export MYVAR=123
systemctl start my.service

MYVAR 在 service 里是空的。

✅ 正确方式:

# /etc/systemd/system/my.service
[Service]
Environment="MYVAR=123"
# 或
EnvironmentFile=/etc/sysconfig/my

3️⃣ sudo 环境继承

默认 sudo 会清理环境变量

方法一:使用 -E

sudo -E env

方法二:配置 /etc/sudoers

Defaults env_keep += "VAR1 VAR2"

4️⃣ crontab(不继承用户环境)

cron 任务 不会继承 shell 环境变量

✅ 在 crontab 中声明:

VAR1=123
* * * * * /path/script.sh

或:

source /home/user/.bash_profile

四、查看是否真的继承

父进程

export TEST_VAR=centos

子进程

echo $TEST_VAR

或:

ps e -p $$

五、什么时候“看起来没继承”

现象 原因
export 了但还是没有 子进程是 systemd / cron / sudo
su 后变量没了 su 默认不保留
ssh 后变量没了 ssh 不会传未导出的变量

六、总结一句话 ✅

CentOS 中子进程自动继承父进程的环境变量,前提是你用的是 export,并且父进程没有被环境重置(如 systemd、sudo、cron)。


如果你有具体场景(比如 systemd / sudo / Jenkins / Docker / SSH),可以贴出来,我可以给你精确的配置方案。

0