温馨提示×

centos env怎样继承父进程

小樊
53
2026-10-12 02:28:16
栏目: 智能运维

在 CentOS(以及所有 Linux 系统)中,环境变量(env)本身就是从父进程继承给子进程的,这是操作系统的默认行为。你通常不需要“额外配置”去让它继承,反而需要显式避免继承或显式传递。

下面分几种常见情况说明:


一、默认情况:子进程自动继承父进程的环境变量

例如:

# 父进程(当前 shell)
export MY_VAR=hello
echo $MY_VAR
# 启动子进程(bash、脚本、程序)
bash -c 'echo $MY_VAR'

输出:

hello

✅ 只要用 export 设置,子进程就会继承


二、在脚本中继承父进程环境

1️⃣ Shell 脚本

#!/bin/bash
echo $MY_VAR

执行:

export MY_VAR=centos
./test.sh

✅ 脚本会继承当前 shell 的环境变量


2️⃣ 在 systemd 服务中继承(⚠️ 重点)

systemd 服务默认不会继承 shell 的环境变量

方法一:在 service 文件中显式设置

[Service]
Environment=MY_VAR=centos
ExecStart=/opt/app/start.sh

方法二:从文件读取

[Service]
EnvironmentFile=/etc/sysconfig/myapp
ExecStart=/opt/app/start.sh

/etc/sysconfig/myapp:

MY_VAR=centos

方法三:使用 PassEnvironment(仅对 user service 或某些情况有效)

[Service]
PassEnvironment=MY_VAR

三、程序中继承环境(C / Python / Java 等)

C 程序

extern char **environ;

Python

import os
print(os.environ["MY_VAR"])

✅ 自动继承父进程 env


四、临时不继承环境(反例)

env -i bash

或

env -i ./app

❌ 子进程不会继承任何环境变量


五、常见误区

写法 是否继承
VAR=123 ./app ✅ 仅对该命令生效
VAR=123 ❌ 不 export,不继承
export VAR=123 ✅ 全局继承
systemd 启动 ❌ 默认不继承 shell env

六、总结一句话

CentOS 中环境变量默认就会从父进程继承,关键是:用 export 设置,并确保不是被 systemd / env -i 等环境隔离机制阻断。

如果你有具体场景(比如:cron、systemd、docker、sudo、某个程序不读 env),可以告诉我,我可以给你精确方案。

0 踩