通过shell脚本检查Tomcat是否在运行

4
我需要通过一个shell脚本来检查Tomcat是否在我的系统中运行。如果没有,我需要捕获进程ID并杀死Tomcat。应该如何实现?

定义“正在运行”。按照普通的定义,没有运行的东西没有进程ID,也不能被终止。我在这里并不是在挖苦你;你可能是指“正在正确处理请求”,一旦你能够定义清楚,你就会知道如何编写你的脚本了。(另外,你可能想尝试一下Serverfault,他们在系统监控方面有更多的经验) - derobert
@BugFinder:我已经尝试使用这条命令,pid=$(ps -fe | grep tomcat)。这将获取所有带有上下文“tomcat”的进程,然后使用killall命令。 - Gopinagh.R
4个回答

11
为了获取运行中的进程,我使用了以下命令: ps x | grep [full_path_to_tomcat] | grep -v grep | cut -d ' ' -f 1
但需要注意,这个命令在我的设置上可用,但不一定适用于其他地方。我有两个tomcat安装,一个是端口8080的/usr/local/tomcat,另一个是端口8081的/usr/local/tomcat_8081。因此必须使用'/usr/local/tomcat/'(带有最后的斜杠),否则如果tomcat_8081也在运行,则会返回2个不同的PID。
下面是该命令的解释:
1) ps x 命令按照pid、tty、stat、运行时间和命令的顺序给出正在运行的进程列表。
2) 对其应用grep [full_path_to_tomcat]将在列表中查找[full_path_to_tomcat]模式。例如,运行ps x | grep /usr/local/tomcat/可能会得到以下结果:
13277 ?        Sl     7:13 /usr/local/java/bin/java -Djava.util.logging.config.fil
e=/usr/local/tomcat/conf/logging.properties [...] -Dcatalina.home=/usr/local/tomca
t [...]
21149 pts/0    S+     0:00 grep /usr/local/tomcat/

3)由于 grep /usr/local/tomcat/ 匹配了模式,导致我们获得了两个条目而不是一个,让我们将其删除。 -v 是 grep 的反向匹配标志,意味着它只会选择不符合模式的行。因此,在前面的示例中,使用 ps -x | grep /usr/local/tomcat/ | grep -v grep 将返回:

13277 ?        Sl     7:13 /usr/local/java/bin/java -Djava.util.logging.config.fil
e=/usr/local/tomcat/conf/logging.properties [...] -Dcatalina.home=/usr/local/tomca
t [...]

4) 很好,现在我们有了所需的pid。不过,我们还需要删除所有其他内容。为此,让我们使用cut命令。这个命令可以从一个文件或标准输出中删除部分内容。-d选项是分隔符,而-f选项是您需要的字段。太棒了。因此,我们可以使用空格 (' ') 作为分隔符,并获取第一个字段,它对应于pid。运行ps x | grep /usr/local/tomcat/ | grep -v grep | cut -d ' ' -f 1将返回:

13277

这就是你所需要的。要在你的脚本中使用它很简单:

#replace below with your tomcat path
tomcat_path=/users/tomcat/apache-tomcat-8.0.30
pid=$(ps x | grep "${tomcat_path}" | grep -v grep | cut -d ' ' -f 1)
if [ "${pid}" ]; then
  eval "kill ${pid}"
fi

6
详细且不错的答案。唯一要做的不同之处是使用awk而不是cut,像这样:ps axuw | grep path/to/tomcat | grep -v grep | awk '{print $2}' - atripes
对我来说不起作用...我的Tomcat已经启动,我可以通过“ps -ef | grep tomcat”命令看到PID,但是上面的命令没有返回任何内容。 - Willians Martins
@WilliansMartins 你是否已经将tomcat_path替换为实际路径?如果你只安装了一个Tomcat,你可以直接使用“grep tomcat”。 - Tarek
1
如果找到了,它会打印一行空白,我使用@atripes的解决方案使其工作。如果没有Tomcat在运行,则不会打印任何内容。使用Ubuntu 19.04。 - Hinotori
当进程号低于10000时,“ps x”会放置前导空格字符,而“cut -d ' ' -f 1”则返回空值。最好使用atripes的解决方案https://dev59.com/tWfWa4cB1Zd3GeqPdyC5#SaefEYcBWogLw_1bOBsX - Dennis Kim

4

使用wget命令检查服务器地址并检查状态的一种方法。

在此处检查链接:

http://www.velvettools.com/2013/07/shell-script-to-check-tomcat-status-and.html#.VX_jfVz-X1E

TOMCAT_HOME=/usr/local/tomcat-folder/

is_Running ()
{

        wget -O - http://yourserver.com/ >& /dev/null
 if( test $? -eq 0 ) then
  return 0
 else
  return 1
 fi
}



stop_Tomcat ()
{
 echo "shutting down......"
 $TOMCAT_HOME/bin/shutdown.sh
}

start_Tomcat ()
{
 echo "starting......"
 $TOMCAT_HOME/bin/startup.sh
}

restart ()
{
 stop_Tomcat
 sleep 10
 kill_Hanged_Processes
 start_Tomcat
 sleep 60
}

请问您能否详细阐述一下您的答案,并对您提供的解决方案进行更多描述? - abarisone

2

简单的方法是:

 ps -ef | grep tomcat

通过使用这个命令,你将会得到:
user [id-to-kill] Date [tomcat-path]

最后一步是结束进程。
sudo kill -9 [id-to-kill]

恭喜,您的进程已被终止。

即使Tomcat未运行,它也显示进程。1000 8309 4960 0 20:51 pts/1 00:00:00 grep --color=auto tomcat或者,如果您搜索任何不存在的内容(neo44),它会回复$ ps aux | grep neo44 1000 8397 0.0 0.0 13640 952 pts/1 S+ 20:53 0:00 grep --color=auto neo44 - prayagupa
ps -ef | grep tomcat 命令可以在输出中查找包含 "tomcat" 的任何内容,通常包括 grep tomcat 进程。您可以使用 -v 标志进行过滤,例如 ps -ef | grep tomcat | grep -v grep,也可以使用 pgrep 或者更具发行版和设置特定的命令,例如 service tomcat status - CodeShane

1

Tomcat的默认端口是8080。您可以使用grep命令并将端口状态与比较循环一起使用。

#!/bin/bash
STAT=`netstat -na | grep 8080 | awk '{print $7}'`
if [ "$STAT" = "LISTEN" ]; then
    echo "DEFAULT TOMCAT PORT IS LISTENING, SO ITS OK"
elif [ "$STAT" = "" ]; then 
    echo "8080 PORT IS NOT IN USE SO TOMCAT IS NOT WORKING"
    ## only if you defined CATALINA_HOME in JAVA ENV ##
    cd $CATALINA_HOME/bin
    ./startup.sh
fi
RESULT=`netstat -na | grep 8080 | awk '{print $7}' | wc -l`
if [ "$RESULT" = 0 ]; then
    echo "TOMCAT PORT STILL NOT LISTENING"
elif [ "$RESULT" != 0 ]; then
    echo "TOMCAT PORT IS LISTENINS AND SO TOMCAT WORKING"
fi

您可以通过比较脚本来进行检查。如果使用Tomcat的默认端口,则可以使用grep port 8080命令进行检查,这只会检查Tomcat是否正在运行。 接下来,您可以检查使用该端口的进程 lsof -i:8080 //如果使用的是8080端口

如果要通过终止使用该端口的进程来释放端口,使用以下命令 kill 75782 //例如75782是使用该端口的进程


我已经编辑了您的帖子以修复代码格式。作为参考,{ }按钮将标记所选内容为代码(通过在每行前插入4个空格)。 - derobert
@gopinagh:明确一下,这是dansh的解决方案,不是我的。不过很高兴听到它起作用了。 - derobert
1
这个脚本不适用于其他语言。在我的系统中,它是pt_br版本的,我必须使用awk '{print $6}',这会给我“OUÇA”(相当于“LISTEN”)。 - Tarek
1
我使用的是英文美国设置,还必须更改为 {print $6}。 - monzonj

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接