【问题标题】:environment variables for non interactive bash shells非交互式 bash shell 的环境变量
【发布时间】:2017-09-07 13:16:21
【问题描述】:

我们有一个非交互式 bash shell 命令,它执行一些代码并且该代码读取一些环境变量。

 #!/bin/bash 
  export PATH="/usr/sbin:/sbin:/usr/lib/ambari-server/*:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/var/lib/ambari-agent"
    export HADOOP_CONF_DIR=${HADOOP_CONF_DIR:-"/usr/hdp/current/hadoop-client/conf"}
    export JAVA_HOME=${JAVA_HOME:-"/usr/java/default"}
    export LANG="en_US.UTF-8"
    export NM_HOST="test.com"
    export LOGNAME="root"
    export JVM_PID="$$"
    export PWD="/opt/hadoop/yarn/local/usercache/root/appcache/application_1504729685201_0003/container_e11_1504729685201_0003_01_000002"
    export LOCAL_DIRS="/opt/hadoop/yarn/local/usercache/root/appcache/application_1504729685201_0003"
    export SHDP_CONTAINERID="container_e11_1504729685201_0003_01_000002"
    export NM_HTTP_PORT="8042"
    export LOG_DIRS="/opt/hadoop/yarn/log/application_1504729685201_0003/container_e11_1504729685201_0003_01_000002"
    export NM_AUX_SERVICE_mapreduce_shuffle="AAA0+gAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA=
    "
    export NM_PORT="45454"
    export USER="root"
    export HADOOP_YARN_HOME=${HADOOP_YARN_HOME:-"/usr/hdp/current/hadoop-yarn-nodemanager"}
    export CLASSPATH="/org/test/import/application.yml:./*"
    export HADOOP_TOKEN_FILE_LOCATION="/opt/hadoop/yarn/local/usercache/root/appcache/application_1504729685201_0003/container_e11_1504729685201_0003_01_000002/container_tokens"
    export NM_AUX_SERVICE_spark_shuffle=""
    export LOCAL_USER_DIRS="/opt/hadoop/yarn/local/usercache/root/"
    export HADOOP_HOME="/usr/hdp/2.6.1.0-129/hadoop"
    export HOME="/home/"
    export NM_AUX_SERVICE_spark2_shuffle=""
    export CONTAINER_ID="container_e11_1504729685201_0003_01_000002"
    export MALLOC_ARENA_MAX="4"
    ln -sf "/opt/hadoop/yarn/local/usercache/root/appcache/application_1504729685201_0003/filecache/11/application.yml" "application.yml"
    hadoop_shell_errorcode=$?
    if [ $hadoop_shell_errorcode -ne 0 ]
    then
      exit $hadoop_shell_errorcode
    fi
    ln -sf "/opt/hadoop/yarn/local/usercache/root/appcache/application_1504729685201_0003/filecache/12/test.jar" "test.jar"
    hadoop_shell_errorcode=$?
    if [ $hadoop_shell_errorcode -ne 0 ]
    then
      exit $hadoop_shell_errorcode
    fi
    # Creating copy of launch script
    cp "launch_container.sh" "/opt/hadoop/yarn/log/application_1504729685201_0003/container_e11_1504729685201_0003_01_000002/launch_container.sh"
    chmod 640 "/opt/hadoop/yarn/log/application_1504729685201_0003/container_e11_1504729685201_0003_01_000002/launch_container.sh"
    # Determining directory contents
    echo "ls -l:" 1>"/opt/hadoop/yarn/log/application_1504729685201_0003/container_e11_1504729685201_0003_01_000002/directory.info"
    ls -l 1>>"/opt/hadoop/yarn/log/application_1504729685201_0003/container_e11_1504729685201_0003_01_000002/directory.info"
    echo "find -L . -maxdepth 5 -ls:" 1>>"/opt/hadoop/yarn/log/application_1504729685201_0003/container_e11_1504729685201_0003_01_000002/directory.info"
    find -L . -maxdepth 5 -ls 1>>"/opt/hadoop/yarn/log/application_1504729685201_0003/container_e11_1504729685201_0003_01_000002/directory.info"
    echo "broken symlinks(find -L . -maxdepth 5 -type l -ls):" 1>>"/opt/hadoop/yarn/log/application_1504729685201_0003/container_e11_1504729685201_0003_01_000002/directory.info"
    find -L . -maxdepth 5 -type l -ls 1>>"/opt/hadoop/yarn/log/application_1504729685201_0003/container_e11_1504729685201_0003_01_000002/directory.info"

    exec /bin/bash -c "$JAVA_HOME/bin/java -jar test.jar  1>/opt/hadoop/yarn/log/application_1504729685201_0003/container_e11_1504729685201_0003_01_000002/Container.stdout 2>/opt/hadoop/yarn/log/application_1504729685201_0003/container_e11_1504729685201_0003_01_000002/Container.stderr"
    hadoop_shell_errorcode=$?
    if [ $hadoop_shell_errorcode -ne 0 ]
    then
      exit $hadoop_shell_errorcode

我们在 ~/.bashrc 文件中添加了代码所需的环境变量,但似乎非交互式 shell 不读取此文件,因此我们的代码无法获取所需的环境变量。不幸的是,我使用的 bash 脚本是自动生成的,我无法在那里导出我的环境变量。有没有其他方法可以使 env 变量可用于我们的 java 代码?谢谢。

【问题讨论】:

  • 您是正确的,非交互式 shell 不来源 .bashrc。你是如何实际运行脚本的?
  • 无关,但似乎没有必要调用/bin/bashexec "$JAVA_HOME/bin/java" -jar test.jar 也可以。
  • 其实整个代码都在一个.sh文件中,这个文件是spring yarn框架自动生成和执行的。
  • 我不熟悉那个框架,但是如果它没有提供一种方法来指定它将执行的命令的环境,我会感到非常惊讶。
  • 再次问同样的问题,因为the first 已关闭并且您不同意关闭不是一个选项。正确的方法是投票支持它重新开放。

标签: java linux bash shell unix


【解决方案1】:

具体需要的环境变量可以在/etc/hadoop/conf/yarn-site.xml中配置,里面有个属性yarn.nodemanager.admin-env用来列出应该从NodeManager 的环境到容器的。 默认情况下,该值为 MALLOC_ARENA_MAX=$MALLOC_ARENA_MAX,您只需在逗号分隔的列表中附加您需要传递的变量: 例如 MALLOC_ARENA_MAX=$MALLOC_ARENA_MAX,YOUR_VARIABLE=$YOUR_VARIABLE

这也可以在 Yarn-site 高级配置部分中使用 Ambari 进行配置。

使用 /etc/profile.d/ 中的脚本来设置可供所有用户使用的全局环境变量是一种很好的做法。

参考资料: - Yarn 站点默认配置 https://hadoop.apache.org/docs/r0.23.11/hadoop-yarn/hadoop-yarn-common/yarn-default.xml

【讨论】:

    猜你喜欢
    • 2016-02-17
    • 2013-04-16
    • 2021-12-08
    • 2017-07-04
    • 1970-01-01
    • 2012-10-01
    • 2017-11-24
    • 2010-10-12
    • 1970-01-01
    相关资源
    最近更新 更多