SSH远程执行脚本tomcat未启动

Posted 笃行之

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了SSH远程执行脚本tomcat未启动相关的知识,希望对你有一定的参考价值。

SSH远程执行脚本tomcat未启动

背景:
就是为了写一个重启tomcat的脚本,让jenkins编译、打包、发布时调用。在本地写好重启tomcat的脚本后,本地执行脚本没有问题,但在远程服务器上SSH免密登录执行后。
发现可以把TOMCAT杀死,但tomcat却起不来。这个问题困扰了我一天。终于解决了,决定写篇博文与大家分享。

把我遇到的怪异现象分享给大家:
1 脚本执行了吗?sh -x 查看脚本执行过程,确实执行了啊,也没有报错。但到目标服务器去看却没有java进程,也没有相应的端口。邪门了,到底是什么原因呢?
2 看日志。在远程执行脚本的时候就把日志打开了,tail -f 发现没有一丁点的日志输出。
3 有人说是环境变量的问题。个人感觉不是啊。我在本地可以执行脚本说明不是环境变量的问题。

原因:
有人说:这个脚本远程运行的话,远程会话结束以后会把这个子进程干掉
有人说:就如同,你在本地xshell执行脚本 脚本还在跑的阶段你关闭xshell ,你怎么让脚本不停止而继续运行呢?
有人说:你这个进程过去 ansible执行完了就没了。我的ansible命令是这样的 ansible abcd -u root -m shell -a "sh -x /data/scripts/start_tomcat.sh"

我自己做了一个测试,我在脚本里启动tomcat后sleep了60秒,我看到tomcat启来了,有日志了,也看到端口了,60秒后端口就自动消失了,同时这个不会写到日志里
说明,可以证实一个事情,“这个脚本远程运行的话,远程会话结束以后会把这个子进程干掉。”

解决办法:
在脚本的启动命令前加上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进程

参考链接:
https://www.cnblogs.com/superjt/p/4079013.html #SSH远程启动tomcat后,退出SSH,tomcat也退出
http://blog.csdn.net/zhengxu189891/article/details/18710155 #jenkins中通过execute shell启动的进程会被杀死的问题

以上是关于SSH远程执行脚本tomcat未启动的主要内容,如果未能解决你的问题,请参考以下文章

ssh连接远程主机执行脚本的环境变量问题

java远程连接linux,执行脚本启动Tomcat

大坑,jenkins 配置publish over ssh bash 插件,远程部署,无法执行shell脚本

DevOps之四--Publish over SSH远程部署

paramiko的简单使用(ssh远程执行脚本和上传文件)

ssh远程执行遇到的一些坑