为什么进程看不到 /etc/environment 中设置的环境变量?

为什么进程看不到 /etc/environment 中设置的环境变量?

我在 /etc/environment 中定义了几个环境变量,但进程(由 TeamCity 启动的构建)无法看到它们的值。我不知道我在这里做错了什么。这是我的 /etc/environment 文件的内容:

PATH="/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games"

CATALINA_BASE="/var/lib/tomcat7"
CATALINA_HOME="/usr/share/tomcat7"

ACTIVEMQ_HOME="var/lib/activemq"
ACTIVEMQ_BASE="var/lib/activemq"
ACTIVEMQ_CONF="var/lib/activemq/conf"
ACTIVEMQ_DATA="var/lib/activemq/data"
ACTIVEMQ_OPTS_MEMORY="-Xms128m -Xmx192m"

M2_HOME="/usr/share/maven3"
MAVEN_HOME="/usr/share/maven3"
JAVA_HOME="/usr/lib/jvm/java-8-oracle"

TeamCity 启动的构建使用 Maven 运行器,并在某个时候启动 Ant 构建。由于构建失败,我使用 Ant 打印系统中的所有环境变量:

<!-- Provides all environment variables as Ant properties prefixed by "env.".
For example, CLASSPATH would be accessible in Ant as ${env.CLASSPATH} -->
<property environment="env"/>


<echo>List of all Environment Variables found in the system:</echo>
<echoproperties>
    <propertyset>
        <propertyref prefix="env."/>
    </propertyset>
</echoproperties>

果然,我设置于 /etc/environment 中的那些并没有出现。

运行此程序的构建代理使用 Ubuntu 的启动应用程序启动,我将其配置为运行以下命令:

sudo -H -u administrator /bin/bash --login -c "~administrator/BuildAgent/bin/agent.sh start"

这行是否可能是在 /etc/environment 设置之前运行的?

如果我这样做,echo $CATALINA_HOME我会看到值设置正确,但是由于某种原因,构建无法看到它......

笔记:虽然我知道这是错误的做法,但我也尝试export在里面添加声明/etc/environment,但没有成功。然后我把它删掉了。

笔记2:当然,在对 /etc/environment 文件进行更改后,我重新启动了机器。

我在 14.04 LTS 服务器上安装了最小桌面(ubuntu-desktop --no--install-recommends)以及一些附加功能。

任何帮助都将不胜感激,谢谢!

答案1

仔细读sudoers手册页命令环境部分。

尝试 -i 选项:如果指定了 sudo 的 -i 选项(初始登录),则无论 env_reset 的值如何,sudoers 都会初始化环境。DISPLAY、PATH 和 TERM 变量保持不变;HOME、MAIL、SHELL、USER 和 LOGNAME 根据目标用户设置。在 AIX(以及没有 PAM 的 Linux 系统)上,/etc/environment 的内容也包括在内。所有其他环境变量都将被删除。

    sudo -u administrator -i "~administrator/BuildAgent/bin/agent.sh start"

如果您使用 PAM 身份验证,这里有一个有用的链接:/etc/security/pam_env.conf 和 /etc/environment 之间的区别 + 让 sudo 读取 pam_env.conf

相关内容