SSH远程执行脚本tomcat未启动

背景:
在本地写好重启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"

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

解决办法:
在脚本的启动命令前加上nohup ,即如下
nohup /data/server/apache-tomcat-8.0.47-8080/bin/startup.sh &

还有一个解决办法就是
shell脚本里边加上这一行就行了:BUILD_ID=DONTKILLME
在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启动的进程会被杀死的问题

时间: 2024-10-27 19:15:56

SSH远程执行脚本tomcat未启动的相关文章

ssh非交互式密码授权远程执行脚本

公司有上百台服务器,需要为每台服务器都执行一个脚本,因为所有服务器的账号密码都是一样的,所以可以不用搭建ansible等自动化运维工具,我们直接通过ssh远程执行即可完成 本文以三台服务器为例,系统版本:Centos7.3 1.安装sshpass cd /etc/yum.repos.d/ wgethttp://download.opensuse.org/repositories/home:Strahlex/CentOS_CentOS-6/home:Strahlex.repo yum instal

SSH 无密码远程执行脚本

ssh无密码登录及远程执行脚本要使用公钥与私钥.linux下可以用用ssh-keygen生成公钥/私钥对,下面我以CentOS7为例. 测试环境:机器A(10.0.224.80):机器B(192.168.7.172).现想A通过ssh免密码在B上远程执行命令. 1.首先在A机下生成公钥/私钥对:(-P表示密码,-P '' 就表示空密码,一次回车即可.在~/.ssh会生成id_rsa和id_rsa.pub两个文件) [[email protected] home]# ssh-keygen -t r

解决SSH远程执行命令找不到环境变量的问题

通过SSH执行远程主机的命令或脚本时,经常会出现找不到自定义环境变量的问题.但是,如果通过SSH登录远程主机,然后再执行相同的命令或脚本,那么此时执行又是成功的.两种相似的方法,得到的结果却截然不同,看起来很诡异的现象,根本原因在于这两种方式使用的bash模式不同! 1. 通过SSH登录后再执行命令和脚本这种方式会使用Bash的interactive + login shell模式,这里面有两个概念需要解释:interactive和login. login故名思义,即登陆,login shell

SSH 远程执行任务

SSH 是 Linux 下进行远程连接的基本工具,但是如果仅仅用它来登录那可是太浪费啦!SSH 命令可是完成远程操作的神器啊,借助它我们可以把很多的远程操作自动化掉!下面就对 SSH 的远程操作功能进行一个小小的总结. 远程执行命令 如果我们要查看一下某台主机的磁盘使用情况,是不是必须要登录到目标主机上才能执行 df 命令呢?当然不是的,我们可以使用 ssh 命令在远程的主机上执行 df 命令,然后直接把结果显示出来.整个过程就像是在本地执行了一条命令一样: $ ssh [email prote

使用ssh远程执行命令批量导出数据库到本地

前天正在跟前端的同事调试功能.服务器开好,模拟的玩家登录好,就在倒计时.这时突然运营的同事跑过来说要统计几个服务器玩家的一些情况,也就是需要从几个服的数据库导出部分玩家的数据.好吧,我看了一下时间,11:47.心想,跟前端调试完,去吃个饭再午休一下那就下午再给吧.没想对方来一句"就导个数据库而已,要这么久么?",而且还是直接跟我上司说的.我嚓,好吧,我导.可问题来了,平时的统计是由php做的,批量部署这些是由运维做的.服务端完全没有对应的工具.而且服务器是在阿里云上的,数据库的用户是限

使用ssh远程执行命令批量导出数据库到本地(转)

前天正在跟前端的同事调试功能.服务器开好,模拟的玩家登录好,就在倒计时.这时突然运营的同事跑过来说要统计几个服务器玩家的一些情况,也就是需要从几个服的数据库导出部分玩家的数据.好吧,我看了一下时间,11:47.心想,跟前端调试完,去吃个饭再午休一下那就下午再给吧.没想对方来一句"就导个数据库而已,要这么久么?",而且还是直接跟我上司说的.我嚓,好吧,我导.可问题来了,平时的统计是由php做的,批量部署这些是由运维做的.服务端完全没有对应的工具.而且服务器是在阿里云上的,数据库的用户是限

ssh 远程执行命令

SSH 是 Linux 下进行远程连接的基本工具,但是如果仅仅用它来登录那可是太浪费啦!SSH 命令可是完成远程操作的神器啊,借助它我们可以把很多的远程操作自动化掉!下面就对 SSH 的远程操作功能进行一个小小的总结. 远程执行命令 如果我们要查看一下某台主机的磁盘使用情况,是不是必须要登录到目标主机上才能执行 df 命令呢?当然不是的,我们可以使用 ssh 命令在远程的主机上执行 df 命令,然后直接把结果显示出来.整个过程就像是在本地执行了一条命令一样: $ ssh [email prote

[转帖]ssh 远程执行命令

https://www.cnblogs.com/youngerger/p/9104144.html SSH 是 Linux 下进行远程连接的基本工具,但是如果仅仅用它来登录那可是太浪费啦!SSH 命令可是完成远程操作的神器啊,借助它我们可以把很多的远程操作自动化掉!下面就对 SSH 的远程操作功能进行一个小小的总结. 远程执行命令 如果我们要查看一下某台主机的磁盘使用情况,是不是必须要登录到目标主机上才能执行 df 命令呢?当然不是的,我们可以使用 ssh 命令在远程的主机上执行 df 命令,然

ssh远程执行命令的符号转义问题

远程执行命令 前提条件 配置ssh免密码登陆. 命令 ssh [email protected]_host "cmd..." 脚本 ssh [email protected]_host <<EOF cmd1 cmd2 ... EOF 特殊字符的转义 远程执行脚本的情况下,脚本中的内容可视为是双引号包含起来的. 远程执行命令的情况下,例如:ssh [email protected]_host "${COMMOND}": 使用单引号的时候,$COMMAND定