SSH远程重启Tomcat时无法找到JAVA_HOME也连接不上SAP详解编程语言
1. catalina.sh添加Java环境变量
在Agent上通过SSH命令重启目标应用服务器的Tomcat时:
ssh [email protected]_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 [email protected]_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 [email protected]_ip "java -version"
便可以查看到目标应用服务器的Java版本了。
对于bashrc和profile的更深层次理解请参考:理解 bashrc 和 profile
Shell的分类
系统的 shell 有很多种, 比如 bash, sh, zsh 之类的, 如果要查看某一个用户使用的是什么 shell 可以通过 finger [USERNAME] 命令来查看. 我们这里只说 shell 是 bash 的情况, 因为如果是 sh 或者其他 shell 显然不会运行 bashrc 的. 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 文件. interactive shell 和 non-interactive shell
interactive shell 是交互式shell, 顾名思义就是用来和用户交互的, 提供了命令提示符可以输入命令.
该模式下会存在一个叫 PS1 的环境变量, 如果还不是 login shell 的则会去 source /etc/bash.bashrc 和 ~/.bashrc 文件
non-interactive shell 则一般是通过 bash -c “CMD” 来执行的bash. bashrc 和 profile 的区别
profile
其实看名字就能了解大概了, profile 是某个用户唯一的用来设置环境变量的地方, 因为用户可以有多个 shell 比如 bash, sh, zsh 之类的, 但像环境变量这种其实只需要在统一的一个地方初始化就可以了, 而这就是 profile.
bashrc
bashrc 也是看名字就知道, 是专门用来给 bash 做初始化的比如用来初始化 bash 的设置, bash 的代码补全, bash 的别名, bash 的颜色. 以此类推也就还会有 shrc, zshrc 这样的文件存在了, 只是 bash 太常用了而已.
相关文章
- java中applet是什么意思_Java Applet与Java Application的区别
- Java商城源码最好用的java商城电商系统之一
- MySQL字段类型如何转为java_Java JDBC中,MySQL字段类型到JAVA类型的转换
- java resourcebundle_Java – Properties和ResourceBundle类学习「建议收藏」
- 用java实现笛卡尔积_Java实现笛卡尔积
- java设计模式1,单一职责原则
- c#byte类型转换成string_java字符串转byte数组
- Java实现静态代理[通俗易懂]
- java打印菱形代码_打印空心菱形
- Java使用NIO实现Socket通信
- Java基础--运算符
- 面试必问:说一下 Java 虚拟机的内存布局?
- Java正则表达式验证工具类详解编程语言
- Java项目实战之物流配货系统
- 自动删除Java 实现 Redis 自动过期删除(redisjava过期)
- 键管理Java中Redis实现过期键管理(redisjava过期)
- 时间处理使用Java操作Redis快速设置过期时间(redisjava过期)
- Redis搭配Java实现数据过期(redisjava过期)
- 策略研究Redis Java实现的过期策略(redisjava过期)
- 时间研究Java实现Redis过期时间管理(redisjava过期)
- 如何在Linux系统下有效地启动Java程序,让你的代码在Linux中也能正常运行?(linux下启动java)
- MySQL与Java结合,构建高效多功能缓存系统(MySQL java缓存)
- Java存入Oracle数据库实现快速高效的数据存储(java存入oracle)
- Java 8在Oracle中的应用与发展(java8 oracle)
- 重启Redis,从SSH远程控制(ssh重启redis)
- 探讨:如何在NDK中呼叫Java的class
- java图形界面编程之模拟血压计
- java使用poi读取ppt文件和poi读取excel、word示例
- Java设计模式之装饰者模式详解和代码实例