SSH远程执行脚本tomcat未启动java
背景:shell
就是为了写一个重启tomcat的脚本,让jenkins编译、打包、发布时调用。在本地写好重启tomcat的脚本后,本地执行脚本没有问题,但在远程服务器上SSH免密登陆执行后。发现能够把TOMCAT杀死,但tomcat却起不来。这个问题困扰了我一天。终于解决了,决定写篇博文与你们分享。apache
把我遇到的怪异现象分享给你们:后端
1, 脚本执行了吗?sh -x 查看脚本执行过程,确实执行了啊,也没有报错。但到目标服务器去看却没有java进程,也没有相应的端口。邪门了,究竟是什么缘由呢?tomcat
2, 看日志。在远程执行脚本的时候就把日志打开了,tail -f 发现没有一丁点的日志输出。服务器
3, 有人说是环境变量的问题。我的感受不是啊。我在本地能够执行脚本说明不是环境变量的问题。ide
缘由:测试
个人ansible命令是这样的 ansible abcd -u root -m shell -a "sh -x /data/scripts/start_tomcat.sh"ui
我本身作了一个测试,我在脚本里启动tomcat后sleep了60秒,我看到tomcat启来了,有日志了,也看到端口了,60秒后端口就自动消失了,同时这个不会写到日志里。spa
说明,能够证明一个事情,“这个脚本远程运行的话,远程会话结束之后会把这个子进程干掉。”
解决办法:
在脚本的启动命令前加上nohup ,即以下
nohup /data/server/apache-tomcat-8.0.47-8080/bin/startup.sh &
还有一个解决办法就是
shell脚本里边加上这一行就好了:BUILD_ID=DONTKILLME (在使用jenkins的时候)在jenkins中配置自动更新部署项目时,若是采起用execute shell启动/关闭tomcat,会发现能够进行关闭tomcat,可是没法启动tomcat,虽然构建会显示执行成功,可是查看进程,tomcat是没有启动的。
这是由于Jenkins默认会在Build结束后Kill掉全部的衍生进程。
须要进行如下配置,才能避免此类状况发生:重设环境变量build_id在execute shell输入框中加入BUILD_ID=DONTKILLME,便可防止jenkins杀死启动的tomcat进程