赞
踩
ES的Java环境变量已设置,但是启动未生效。
已经设置 了ES_JAVA_HOME环境变量启动ES,还会收到警告:
warning: usage of JAVA_HOME is deprecated, use ES_JAVA_HOME
本篇文章将了解到输出与重定向,Linux环境变量设置与读取相关内容。
当前目录
pwd
/home/es/elasticsearch-7.17.3
查看启动命令
vim bin/elasticsearch
第一行有效命令是执行环境变量设置脚本
source "`dirname "$0"`"/elasticsearch-env
这行命令的意思是:执行elasticsearch-env脚本,设置环境变量。
以下是该脚本 详细讲解:
那么现在来看elasticsearch-env脚本中对JDK相关变量的设置
- # now set the path to java
- if [ ! -z "$ES_JAVA_HOME" ]; then
- JAVA="$ES_JAVA_HOME/bin/java"
- JAVA_TYPE="ES_JAVA_HOME"
- elif [ ! -z "$JAVA_HOME" ]; then
- # fallback to JAVA_HOME
- echo "warning: usage of JAVA_HOME is deprecated, use ES_JAVA_HOME" >&2
- JAVA="$JAVA_HOME/bin/java"
- JAVA_TYPE="JAVA_HOME"
- else
- # use the bundled JDK (default)
- if [ "$(uname -s)" = "Darwin" ]; then
- # macOS has a different structure
- JAVA="$ES_HOME/jdk.app/Contents/Home/bin/java"
- else
- JAVA="$ES_HOME/jdk/bin/java"
- fi
- JAVA_TYPE="bundled JDK"
- fi
由上面脚本可以看到ES的Java环境变量的设置优先级:ES_JAVA_HOME > JAVA_HOME > bundled JDK
解释下就是:
而这里,可以看到ES推荐指定ES_JAVA_HOME。对于ES而言使用JAVA_HOME环境变量配置作为ES启动所需要的Java环境是弃用的方式,建议使用ES_JAVA_HOME
但是呢,
我这里呢,实际上是在安装ES时候手动指定过ES环境变量
- vim .bash_profile
-
- export ES_JAVA_HOME=/home/es/elasticsearch-7.17.3/jdk
- export ES_HOME=/home/es/elasticsearch-7.17.3
-
- source .bash_profile
为什么在终端中启动会提示使用的弃用的JAVA_HOME方式(即使用的当前环境中已经安装的JDK8)呢?
warning: usage of JAVA_HOME is deprecated, use ES_JAVA_HOME
- [root@polaris ~]#
- [root@polaris ~]# su es
- [es@polaris root]$ cd ~/elasticsearch-7.17.3/
- [es@polaris elasticsearch-7.17.3]$
- [es@polaris elasticsearch-7.17.3]$ bin/elasticsearch -d
- warning: usage of JAVA_HOME is deprecated, use ES_JAVA_HOME
- Future versions of Elasticsearch will require Java 11; your Java version from [/home/es/jdk1.8.0_411/jre] does not meet this requirement. Consider switching to a distribution of Elasticsearch with a bundled JDK. If you are already using a distribution with a bundled JDK, ensure the JAVA_HOME environment variable is not set.
- warning: usage of JAVA_HOME is deprecated, use ES_JAVA_HOME
- Future versions of Elasticsearch will require Java 11; your Java version from [/home/es/jdk1.8.0_411/jre] does not meet this requirement. Consider switching to a distribution of Elasticsearch with a bundled JDK. If you are already using a distribution with a bundled JDK, ensure the JAVA_HOME environment variable is not set.
- [es@polaris elasticsearch-7.17.3]$
首先,root用户进入一个终端会话,
然后创建es用户,
然乎su es切换到es用户进行es所有操作
然后在es的主目录(cd ~,对于es这个用户主目录是/home/es)下.bash_profile文件中配置了环境变量ES_JAVA_HOME和ES_HOME,并使用source命令执行使之在当前 shell 会话中立即生效(即当前Shell会话中能够立即读取设置的变量,而不是必须新开一个会话,才能查看到)
注意:如果打开了一个新的终端窗口(即一个新的 shell 会话),这些环境变量也会自动生效,因为 .bash_profile 会在新的 shell 会话开始时自动执行。
那么,问题似乎有了些头绪,对吧,记住一点(后面会考)新启动终端窗口,设置的环境变量就会自动生效。
环境变量设置两种方式:
一种是修改/etc/profile,另一种是修改用户主目录下的.bash_profile。
当你通过SSH登录或打开一个新的终端窗口时/etc/profile或者/home/es/.bash_profile会被加载,
区别在于:
/etc/profile里面配置的环境变量是系统级配置文件,对所有用户都有效;
/home/es/.bash_profile 或 /home/es/.bashrc:这是用户级的配置文件,只对特定用户(在这里是es用户)有效
另外继承关系:
如果用户主目录下~/.bash_profile(或.bash_login、.profile)文件中存在source ~/.bashrc这样的命令,那么.bashrc中的设置将被继承到登录shell中。但.bash_profile中的设置不会自动被.bashrc继承。
回到问题来,设置过环境变量,但是查询环境变量查不到。
根据之前分析有了些头绪,
这时,想到了一个问题,那就是我保存的会话打开的快捷链接中的用户名、密码都是配置的root用户欸,然后切换到es用户去启动es,
由于登录(开启一个新的终端)时会设置环境变量,切换用户并不会设置环境变量。
所以,读取不到设置的环境变量ES_JAVA_HOME(因为root用户登录开启的终端窗口)
那么,只有es用户启动会话或者登录,才可以设置环境变量(因为环境变量是使用es用户配置在用户级环境变量表)。
SSH登录或打开一个新的终端窗口时,才会执行环境变量的设置,切换用户并不会设置环境变量。
用户级环境变量的读取需要使用对应用户登录或打开新的终端窗口时才可读取到。
使用root用户启动的会话获取不到设置的es用户级环境变量
我这个环境里面有java 1.8环境,所以走入了使用当前环境中已经存在的JDK的判断分支的逻辑,于是发出了警告。
现在使用es用户开启会话,可以获取到设置的es用户级环境变量
- echo $ES_JAVA_HOME
- /home/es/elasticsearch-7.17.3/jdk
且启动不会报JAVA环境警告了,表明就是使用的配置的ES_JAVA_HOME中配置的jdk
elasticsearch-env脚本中打印报错信息那一行
echo "warning: usage of JAVA_HOME is deprecated, use ES_JAVA_HOME" >&2
这里说一下 >&2 因为这个类似的用法在实际生产场景中用的非常多。
在 shell 脚本中,>&2 是一个重定向操作符,用于将输出(通常是标准输出,即文件描述符 1)重定向到另一个文件描述符,这里是 2,它通常代表标准错误(stderr)。
在 Unix 和 Unix-like 系统(如 Linux)中,文件描述符是一个非负整数,用于引用打开的文件、套接字或其他类型的 I/O 资源。最常见的文件描述符是:
重定向操作符允许你更改这些文件描述符的默认行为。
stdout(标准输出)和 stderr(标准错误)是 Unix 和 Unix-like 系统(如 Linux 和 macOS)中进程间通信的两个重要概念。这些概念通常与 shell 脚本、命令行工具和其他类型的程序一起使用,用于处理和传输数据。
这两个流都可以被重定向到文件或其他命令,从而改变它们的默认行为。
有时,你可能希望将 stdout 和 stderr 的输出合并到同一个地方。这可以通过将 stderr 重定向到与 stdout 相同的位置来实现,例如:
command > output.txt 2>&1
在 Unix 和类 Unix 系统中,当你使用重定向语法 command > output.txt 2>&1 时,这个命令的执行顺序和重定向的过程是这样的:
这个顺序很重要。
考虑一个名为 my_program 的命令行程序,它可能会输出一些常规结果到 stdout,并在遇到错误时输出错误消息到 stderr。在终端中运行该程序时,用户将看到常规结果和错误消息分别显示(可能是以不同的颜色或前缀)。如果用户希望将这两个流的输出都保存到一个文件中,他们可以使用类似 my_program > output.txt 2>&1 的命令来合并输出。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。