4

我需要通过 shell 脚本检查 Tomcat 是否在我的系统中运行。如果不是,我需要捕获进程 ID 并杀死 Tomcat。将如何实现?

4

4 回答 4

11

为了获得正在运行的进程,我使用了这个命令:

ps x | grep [full_path_to_tomcat] | grep -v grep | cut -d ' ' -f 1

不过,你必须小心。它适用于我的设置,但它可能无法在任何地方运行......我有两个 tomcat 安装,一个是 /usr/local/tomcat 端口 8080 和 /usr/local/tomcat_8081 端口 8081。我必须使用 '/ usr/local/tomcat/'(带有最后一个斜杠)作为 full_path,否则如果 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/匹配模式,我们得到 2 个条目而不是 1 个,让我们删除它。-v是 grep 的反转匹配标志,这意味着它将仅选择与模式不匹配的行。因此,在前面的示例中, usingps -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. 此命令从 FILE 或标准输出中删除部分。-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
于 2013-04-15T20:29:40.260 回答
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
}
于 2015-06-18T09:51:03.433 回答
2

简单的方法是:

 ps -ef | grep tomcat

通过使用此命令,您将获得:

user [id-to-kill] Date [tomcat-path]

最后一步是杀死进程

sudo kill -9 [id-to-kill]

恭喜,你的进程被杀死了 lOol

于 2013-10-09T08:45:40.873 回答
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端口8080。这只会检查tomcat是否正在运行。然后您可以使用端口 lsof -i:8080 //如果使用端口 8080 检查进程

如果您想通过杀死使用它的进程来释放端口,请使用此命令 kill 75782 //如果例如 75782 是使用该端口的进程

于 2012-08-10T09:39:30.143 回答