SSH远程重启Tomcat时无法找到JAVA_HOME也连接不上SAP

1. catalina.sh添加Java环境变量

在Agent上通过SSH命令重启目标应用服务器的Tomcat时:

ssh root@server_ip "/usr/local/tomcat/bin/startup.sh"

可能会报以下错误:

Neither the JAVA_HOME nor the JRE_HOME environment variable is defined

此时有可以在catalina.sh中添加以下内容(注意,不要添加在catalina.sh最后一行,而是添加在较靠前的位置):
在这里插入图片描述
重启Tomcat,应用即可访问,但此时又出现了连接不上SAP的问题。
前往Java安装路径下,查找sapjco3.jar和libsapjco3.so是否已经放置在正确的路径下。具体可参考我的博客:SapJCO问题记录及解决办法
如果已正确放置,那么将添加在catalina.sh中的内容修改为/etc/profile中Java有关的环境变量内容:

JAVA_HOME=/usr/java/jdk1.8.0_144
PATH=$PATH:$JAVA_HOME/bin:
CLASSPATH=:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
LD_LIBRARY_PATH=:$LD_LIBRARY_PATH:$JAVA_HOME/jre/lib/amd64/server
export JAVA_HOME PATH CLASSPATH LD_LIBRARY_PATH

此时再使用SSH重启Tomcat,问题便已经解决,可以与SAP连接上了。

2. setclasspath.sh添加Java环境变量

另外一种方法是在setclasspath.sh中添加同样的JAVA环境变量。具体原因可参考:tomcat启动:startup.sh、catalina.sh、setclasspath.sh三者关系

3. ~/.bashrc添加Java环境变量

但是此时使用SSH执行java -version命令:

ssh root@server_ip "java -version"

却提示找不到Java命令
在这里插入图片描述
而在直接在应用服务器上使用java -version命令是可以查出Java版本的。
具体原因可以参考:在使用ssh命令的时候出现了找不到JAVA_HOME的问题

通过ssh登陆之后会发现找不到JAVA_HOME ,我的JAVA_HOME是定义在/etc/profile 里面的。
研究后发现远程登录和直接登录执行的文件是不一样的:
/etc/profile: 当用户登录时,该文件被执行.
/etc/bashrc: 当bash shell被打开时,该文件被执行.
ssh作为远程登录的方式进入,当然就无法触发/etc/profile的执行,所以会发生找不到JAVA_HOME的问题,所以需要将java的配置信息配置到bashrc的文件中去,配置步骤如下所示:
.bashrc是一个隐藏的文件,要打开并修改该文件需要:
(1) 命令 vim ~/.bashrc 进入到文件;
(2) 直接按 i 键可以对文件进行修改, Esc + :+ wq退出并保存修改之后的文件
(3) 命令 :source ~/.bashrc 更新 .bashrc

所以,根本解决办法是在~/.bashrc中添加Java环境变量:

JAVA_HOME=/usr/java/jdk1.8.0_144
PATH=$PATH:$JAVA_HOME/bin:
CLASSPATH=:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
LD_LIBRARY_PATH=:$LD_LIBRARY_PATH:$JAVA_HOME/jre/lib/amd64/server
export JAVA_HOME PATH CLASSPATH LD_LIBRARY_PATH

再次执行:

ssh root@server_ip "java -version"

便可以查看到目标应用服务器的Java版本了。
对于bashrc和profile的更深层次理解请参考:理解 bashrc 和 profile

  1. Shell的分类
    系统的 shell 有很多种, 比如 bash, sh, zsh 之类的, 如果要查看某一个用户使用的是什么 shell 可以通过 finger [USERNAME] 命令来查看. 我们这里只说 shell 是 bash 的情况, 因为如果是 sh 或者其他 shell 显然不会运行 bashrc 的.
  2. login shell 和 no-login shell
    “login shell” 代表用户登入, 比如使用 “su -“ 命令, 或者用 ssh 连接到某一个服务器上, 都会使用该用户默认 shell 启动 login shell 模式.
    该模式下的 shell 会去自动执行 /etc/profile 和 ~/.profile 文件, 但不会执行任何的 bashrc 文件, 所以一般再 /etc/profile 或者 ~/.profile 里我们会手动去 source bashrc 文件.
    而 no-login shell 的情况是我们在终端下直接输入 bash 或者 bash -c “CMD” 来启动的 shell.
    该模式下是不会自动去运行任何的 profile 文件.
  3. interactive shell 和 non-interactive shell
    interactive shell 是交互式shell, 顾名思义就是用来和用户交互的, 提供了命令提示符可以输入命令.
    该模式下会存在一个叫 PS1 的环境变量, 如果还不是 login shell 的则会去 source /etc/bash.bashrc 和 ~/.bashrc 文件
    non-interactive shell 则一般是通过 bash -c “CMD” 来执行的bash.
  4. bashrc 和 profile 的区别
    profile
    其实看名字就能了解大概了, profile 是某个用户唯一的用来设置环境变量的地方, 因为用户可以有多个 shell 比如 bash, sh, zsh 之类的, 但像环境变量这种其实只需要在统一的一个地方初始化就可以了, 而这就是 profile.
    bashrc
    bashrc 也是看名字就知道, 是专门用来给 bash 做初始化的比如用来初始化 bash 的设置, bash 的代码补全, bash 的别名, bash 的颜色. 以此类推也就还会有 shrc, zshrc 这样的文件存在了, 只是 bash 太常用了而已.
发布了79 篇原创文章 · 获赞 322 · 访问量 9万+

猜你喜欢

转载自blog.csdn.net/qq_15329947/article/details/98319646