linux下tomcat启动后无进程,Linux中Tomcat shutdown.sh后进程仍然存在解决办法

最近我们在使用Jenkins自动化部署项目时,在生产liunx环境下,使用脚本shutdown.sh停止tomcat服务,然后再start之后发现应用无法访问了,后台查看tomcat进程是发现有个2个tomcat进程,说明之前的shutdown并没有完全停掉tomcat进程。那怎么样tomcat使用shutdown之后立马关掉其进程呢? 经查资料发现在shutdown.sh脚本之后有条命令是这样的:

exec "$PRGDIR"/"$EXECUTABLE" stop "$@"这个就是停止tomcat 服务的命令,我们只需要加一个  -force  就可以在shutdown时强制关闭tomcat进程

exec "$PRGDIR"/"$EXECUTABLE" stop -force "$@"

但光这样还是不行,再shutdown时报错:

Kill failed: $CATALINA_PID not set查找失败原因:

+ FORCE=1

+ '[' '!' -z '' ']'

+ /usr/java/jdk1.6.0_38/bin/java -server -Xms2048m -Xmx2048m -Xmn768m -XX:PermSize=128m -XX:MaxPermSize=256m -XX:+UseParallelOldGC -XX:+PrintGCDateStamps -XX:+PrintGCDetails -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=/home/xrltest1/tomcat/dumpfile/heap.bin -Xloggc:/home/xrltest1/tomcat/logs/gc.log -Djava.util.logging.manager=org.apache.juli.ClassLoaderLogManager -Djava.endorsed.dirs=/home/xrltest1/tomcat/endorsed -classpath /home/xrltest1/tomcat/bin/bootstrap.jar -Dcatalina.base=/home/xrltest1/tomcat -Dcatalina.home=/home/xrltest1/tomcat -Djava.io.tmpdir=/home/xrltest1/tomcat/temp org.apache.catalina.startup.Bootstrap stop

2015-3-21 11:59:53 org.apache.catalina.startup.Catalina stopServer

严重: Catalina.stop:

java.net.ConnectException: Connection refused

at java.net.PlainSocketImpl.socketConnect(Native Method)

at java.net.PlainSocketImpl.doConnect(PlainSocketImpl.java:351)

at java.net.PlainSocketImpl.connectToAddress(PlainSocketImpl.java:213)

at java.net.PlainSocketImpl.connect(PlainSocketImpl.java:200)

at java.net.SocksSocketImpl.connect(SocksSocketImpl.java:366)

at java.net.Socket.connect(Socket.java:529)

at java.net.Socket.connect(Socket.java:478)

at java.net.Socket.(Socket.java:375)

at java.net.Socket.(Socket.java:189)

at org.apache.catalina.startup.Catalina.stopServer(Catalina.java:422)

at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)

at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)

at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)

at java.lang.reflect.Method.invoke(Method.java:597)

at org.apache.catalina.startup.Bootstrap.stopServer(Bootstrap.java:338)

at org.apache.catalina.startup.Bootstrap.main(Bootstrap.java:416)

+ '[' '!' -z '' ']'

+ '[' 1 -eq 1 ']'

+ '[' -z '' ']'

+ echo 'Kill failed: $CATALINA_PID not set'

Kill failed: $CATALINA_PID not set

从中可以看到,首先是执行java命令失败,没有停止tomcat,然后执行-force模块的命令,但是却没有找到$CATALINA_PID设定的进程号,我们先不去关注java执行stop命令为什么报错,而是看看为什么加了-force参数也不起作用了

为什么没有$CATALINA_PID?接下来就带大家一探究竟

首先,我们将涉及到$CATALINA_PID变量的代码全部提取出来:

第一处:

#以下这句判断设置的$CATALINA_PID变量如果不存在,则显示"Using CATALINA_PID:

$CATALINA_PID",如果存在则不显示

if [ ! -z "$CATALINA_PID" ]; then

echo "Using CATALINA_PID:    $CATALINA_PID"

fi

fi#貌似只是判断$CATALINA_PID是否是空字符,其他什么都没有做

第二处:(涉及到start参数的模块内的$CATALINA_PID变量,只是提出来分析,其实不对stop模块有影响)

#这个是start模块内的代码

"$_RUNJAVA" "$LOGGING_CONFIG" $JAVA_OPTS $CATALINA_OPTS \

-Djava.endorsed.dirs="$JAVA_ENDORSED_DIRS" -classpath "$CLASSPATH" \

-Dcatalina.base="$CATALINA_BASE" \

-Dcatalina.home="$CATALINA_HOME" \

-Djava.io.tmpdir="$CATALINA_TMPDIR" \

org.apache.catalina.startup.Bootstrap "$@" start \

>> "$CATALINA_OUT" 2>&1 &

#从&可以看出启动的命令在后台启动

fi

if [ ! -z "$CATALINA_PID" ]; then

#判断CATALINA_PID如果不是空字符,则将Shell最后运行的后台Process的PID 传给$CATALINA_PID

echo $! > "$CATALINA_PID"

#在使用命令运行进程至后台时,可以使用$!抓取前面启动运行在后台进程的进程号

fi

fi

#上面语句是tomcat在启动时,会将$CATALINA_PID写入PID进程号第三处:

#一下语句都出现在stop模块内

if [ ! -z "$CATALINA_PID" ]; then

#$CATALINA_PID文件不是非空

if [ -f "$CATALINA_PID" ]; then

if [ -s "$CATALINA_PID" ]; then

kill -0 `cat "$CATALINA_PID"` >/dev/null 2>&1

#kill -0 pid 不发送任何信号,但是系统会进行错误检查。

if [ $? -gt 0 ]; then

echo "PID file found but no matching process was found. Stop aborted."

exit 1

fi

else

echo "PID file is empty and has been ignored."

fi

else

echo "\$CATALINA_PID was set but the specified file does not exist. Is Tomcat running? Stop aborted."

exit 1

fi

fi

#如果发现$CATALINA_PID则发送一个模拟结束进程的型号,如果返回值为0,则正常,其他则异常,做退出操作

#从上面的sh -x输出的信息对应的是:'[' '!' -z '' ']' 可以看出$CATALINA_PID变量没有设定,所以这个判断直接就结束了,什么都没做

第四处:

#下面的代码紧接着stop的正常停止代码下

if [ ! -z "$CATALINA_PID" ]; then

#如果$CATALINA_PID不为空

if [ -f "$CATALINA_PID" ]; then

#而且还是普通文件

while [ $SLEEP -ge 0 ]; do

#而且$SLEEP还大于0

kill -0 `cat "$CATALINA_PID"` >/dev/null 2>&1

#则测试下tomcat能不能被关闭

if [ $? -gt 0 ]; then

#剩下的参数还有,则清空$CATALINA_PID

rm -f "$CATALINA_PID" >/dev/null 2>&1

if [ $? != 0 ]; then

if [ -w "$CATALINA_PID" ]; then

cat /dev/null > "$CATALINA_PID"

else

echo "Tomcat stopped but the PID file could not be removed or cleared."

fi

fi

break

fi

if [ $SLEEP -gt 0 ]; then

sleep 1

fi

if [ $SLEEP -eq 0 ]; then

if [ $FORCE -eq 0 ]; then

echo "Tomcat did not stop in time. PID file was not removed."

fi

fi

SLEEP=`expr $SLEEP - 1 `

done

fi

fi

#上段语句主要是判断tomcat是否被关闭

#核心语句还是:kill -0 `cat "$CATALINA_PID"` >/dev/null 2>&1

#while语句做sleep使用,用于清空$CATALINA_PID

#但是[ ! -z "$CATALINA_PID" ]导致这段语句什么都没做啊!!!!!第五处:

#这段代码就是涉及-force的核心代码了

if [ $FORCE -eq 1 ]; then

if [ -z "$CATALINA_PID" ]; then

echo "Kill failed: \$CATALINA_PID not set"

else

if [ -f "$CATALINA_PID" ]; then

PID=`cat "$CATALINA_PID"`

echo "Killing Tomcat with the PID: $PID"

kill -9 $PID

#强制执行的核心命令

rm -f "$CATALINA_PID" >/dev/null 2>&1

if [ $? != 0 ]; then

echo "Tomcat was killed but the PID file could not be removed."

fi

fi

fi

fi

#从中就可以看出,sh -x输出的Kill failed: $CATALINA_PID not set是怎么来的总结下,$CATALINA_PID在整个代码中的作用:

1.在tomcat启动时会写入$CATALINA_PID,但是假设我们的环境是多tomcat项目或$CATALINA_PID为空

2.stop代码中,检查$CATALINA_PID是否为空字符,是的话什么都不做

3.sstop代码中,检查$CATALINA_PID是否为空字符,是的话什么都不做

4.force代码中,检查$CATALINA_PID是否为空字符,是的话就报错

也就是说只要没有保存中这个项目的PID,那么正常stop停止不了,-force也是没有用的。

那么该如何解决呢?直接给$CATALINA_PID付PID的值,那么看结果:

+ FORCE=1

+ '[' '!' -z 12031 ']'

+ '[' -f 12031 ']'

+ echo '$CATALINA_PID was set but the specified file does not exist. Is Tomcat running? Stop aborted.'

$CATALINA_PID was set but the specified file does not exist. Is Tomcat running? Stop aborted.涉及到的代码:

if [ -f "$CATALINA_PID" ]; then

if [ -s "$CATALINA_PID" ]; then

kill -0 `cat "$CATALINA_PID"` >/dev/null 2>&1

#kill -0 pid 不发送任何信号,但是系统会进行错误检查。

if [ $? -gt 0 ]; then

echo "PID file found but no matching process was found. Stop aborted."

exit 1

fi

else

echo "PID file is empty and has been ignored."

fi

else

echo "\$CATALINA_PID was set but the specified file does not exist. Is Tomcat running? Stop aborted."

exit 1

#$CATALINA_PID不是个文件,所以不好意思,我退出了....原来$CATALINA_PID还必须是个文件,那么我们可不可以建这么一个文件呢?

在catalina.sh脚本的代码前,加入以下语句:

#########################################################################################

if [ -z "$CATALINA_PID" ]; then

CATALINA_PID=$PRGDIR/CATALINA_PID

cat $CATALINA_PID

fi######################################################################################结果:tomcat停止执行成功,完成结束进程任务

总结:

在我看到的很到部署tomcat的文章中,还没发现有关于设置$CATALINA_PID��件路径的提示(也许是我看到的少),但是此处我要建议小伙伴们,在写tomcat启动、停止、重启的脚本的时候,一定要注意这个变量。

更多Tomcat相关教程见以下内容:

Tomcat 的详细介绍:请点这里

Tomcat 的下载地址:请点这里

0b1331709591d260c1c78e86d0c51c18.png

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/556405.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

扫地机器人电路原理图_扫地机有这一台就够了:石头扫地机器人T6 首拆

听说集齐13台扫地机器人可以召唤扫地机神兽,所以集齐了22台扫地机后我的神兽呢?自从上个月入手了石头科技出品的小瓦青春版扫地机之后已经集齐了所有小米(石头)系扫地机。小瓦青春版是一款无序清洁的扫地机产品,也是石头科技价格最低的入门级…

让我放弃FastDFS拥抱MinIO的8个瞬间

目前可用于文件存储的网络服务选择有很多,比如阿里云OSS、七牛云、腾讯云等等,但是收费都有点小贵。为了帮公司节约成本,之前一直是使用fastDFS作为文件服务器,准确的说是图片服务器。直到我发现了MinIO,我决定放弃Fas…

http 和 https_Golang设置https访问,以及http如何重定向到https

设置https访问:初始代码为http监听:func main() { server : &http.Server{ Addr: ":8080", ... } go func() { if err : server.ListenAndServe(); err ! nil && err ! http.ErrServerClosed { log.Fa…

盘点分布式文件存储系统____分布式文件存储系统简介

盘点分布式文件存储系统 在项目的数据存储中,结构化数据通常采用关系型数据库,非结构化数据(文件)的存储就有很多种方式,服务器本地存储、Nas挂载、ftp等等,今天就来盘点一下,分布式文件存储系统…

常见分布式文件存储介绍、选型比较、架构设计

数据正成为世界上最有价值的资源,分布式文件存储是应对数据爆炸的最好解决方案,那就会涉及到分布式文件存储方案、选型、架构设计等。 分布式文件存储的来源 在这个数据爆炸的时代,产生的数据量不断地在攀升,从GB,TB,PB,ZB.挖掘…

为什么python工程师掌握这些就够了_Python工程师薪资飙升,Python这些技能你掌握了吗...

Python的火热,也带动了工程师们的就业热。那么,Python的市场需求和工程师待遇到底如何呢?今天我们来看看具体数据。2019年招聘python工程师薪资飙升,Python这些技能你掌握了吗?Python岗位和待遇和要求怎么样?下面从招…

canvas js 绘图插件_Canvas专题—绘制柱状图(2)

目标:在我们了解过前两章节的知识点以后,为了把知识点进行连结,拓展,现在我们做一个图表吧。看一个echartst图表当今Canvas库有很多供我们选择,比如,echarts在很大程度上能够提高我们的工作效率&#xff0c…

界面优美的linux,Ubuntu 11.04新版发布 诠释精美用户界面

主要改进内容如下:Unity界面在Alpha 3中进行了重大改进,重新设计了Dash面板的功能,可以按类别显示应用程序,此外还包括更好的搜索过滤、支持全屏以及其他视觉效果的提升。Ubuntu 11.04 Alpha 3升级了安装程序,用户如今…

springboot 使用 minio

springboot 使用 minio yml 配置 yml 配置 # ↓↓↓↓↓↓ MinIO文件服务器 ↓↓↓↓↓↓ minio:url: http://114.67.110.190:9001accessKey: minioadminsecretKey: minioadminbucketName: zpfmaven: <dependency><groupId>io.minio</groupId><artifa…

立创EDA

绘制PCB流程&#xff1a; 画原理图 ——> 画原理图 ——> 布线 ——> 铺铜 器件&#xff1a; 器件就是一个个不同的元件&#xff0c;每个元件不同的引脚有不同的功能&#xff0c;但有可能封装是一样的&#xff0c;所以将器件和封装练习起来&#xff0c;才能将…

python中sorted函数的用法_Python3 中sorted() 函数的用法

描述 sorted() 函数对所有可迭代的对象进行排序操作。 语法 sorted(iterable, keyNone, reverseFalse) iterable – 可迭代对象。 key – 主要是用来进行比较的元素&#xff0c;只有一个参数&#xff0c;具体的函数的参数就是取自于可迭代对象中&#xff0c;指定可迭代对象中的…

springboot整合minio最新版

第一步&#xff1a;查找minio最新依赖&#xff0c;通过maven查询网站查询,这搜索框输入minio&#xff0c; 也可以查看MinIO官网https://docs.min.io/docs/java-client-quickstart-guide.html 如下: 点击minio进入查看maven依赖&#xff0c;可以看到最新版为8.3.4 <dependen…

学生学籍管理系统python_使用Python实现 学生学籍管理系统

大家好&#xff0c;今天跟大家分享一个用Python实现的学生学籍管理系统&#xff1a; 该代码主体由五个函数组成&#xff1a; 1.add_stu() 添加 2.del_stu() 删除 3.print_stu()打印 4.exit_stu() 退出 5.system() 主函数 1.add_stu() 此段函数作用&#xff1a;把输入的值存入字…

Okhttp使用详解

在Android开发中&#xff0c;发送HTTP请求是很常见的。SDK中自带的HttpURLConnection虽然能基本满足需求&#xff0c;但是在使用上有诸多不便&#xff0c;为此&#xff0c;square公司实现了一个HTTP客户端的类库——Okhttp 。 Okhttp是一个支持HTTP 和 HTTP/2 的客户端&#x…

如何开发rest接口服务_如何简化网络请求接口开发

日常开发中&#xff0c;需要大量和后端对接接口&#xff0c;很容易写出大量的模板代码&#xff0c;比如把对接口的请求放到组件内&#xff0c;或者虽然有数据访问层&#xff0c;但是有大量 get&#xff0c;post 方法的调用&#xff0c;传参的字符串拼接&#xff0c;异常处理等等…

质量属性效用树例子_数百个 HTML5 例子学习 HT 图形组件 – 拓扑图篇

HT 是啥&#xff1a;Everything you need to create cutting-edge 2D and 3D visualization.这口号是当年心目中的产品方向&#xff0c;接着就朝这个方向慢慢打磨&#xff0c;如今 HT 算是达到了这样的效果&#xff0c;谈不上用尽洪荒之力&#xff0c;但我们对产品结果很满意&a…

linux vi 出现下划线,Vim高亮当前行(显示为下划线)的解决方案

最近配置Vim&#xff0c;由于以前的vimrc早已丢失&#xff0c;只好重新配置一份&#xff0c;此为题外话&#xff0c;略过不提…在Vim中&#xff0c;可以选择开启高亮当前行&#xff0c;这是一个很不错的特性。开启它也很简单&#xff0c;只需要在vimrc中加入这么一行&#xff1…

springBoot 简单优雅是实现文件上传和下载

前言 好久没有更新spring Boot 这个项目了。最近看了一下docker 的知识&#xff0c;后期打算将spring boot 和docker 结合起来。刚好最近有一个上传文件的工作呢&#xff0c;刚好就想起这个脚手架&#xff0c;将文件上传和下载整理进来。 配置 在application.properties 中增…

C语言的VC开发环境界面介绍,【c语言在vc++6.0中编写界面程序】

到现在为止&#xff0c;C 仍然是计算机编程领域的经典语言之一&#xff0c;C 17 标准在2017上半年已经探讨确定。本期我们汇集了编程专家——祁宇(《深入应用 C 11》作者&#xff0c;C 开源社区 purecpp.org 创始人)的多年心得小结&#xff0c;并具体介绍了 C 17 最新标准中值得…

SpringBoot+VUE 前端加密算法 RSA+DES

前言 为了提高用户登陆的安全性&#xff0c;公司准备整理一份相对安全的登陆模式。 想法 主流加密算法 主流加密算法 &#xff08;一&#xff09;对称加密AES ,其特点是&#xff1a;算法简单&#xff0c;加密速度快&#xff1b; &#xff08;二&#xff09;非对称加密方式&…