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

Gop*_*h.R 4 shell tomcat

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

Tar*_*rek 11

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

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

但是你必须要小心.它适用于我的设置,但它可能不会到处跑......我已经在使用Tomcat的两个安装,一个是8080端口和/ usr /本地/ tomcat_8081在/ usr /本地/ Tomcat的端口8081.我必须使用"/ usr/local/tomcat /'(带有最后的斜杠)作为full_path,否则如果tomcat_8081正在运行,它将返回2个不同的pid.

这是对此命令的作用的解释:

1)ps x给出一个按pid,tty,stat,time running和command命令运行的进程列表.

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/
Run Code Online (Sandbox Code Playgroud)

3)由于grep /usr/local/tomcat/匹配模式我们得到2个条目而不是1个条目,让我们删除它.-v是grep的反转匹配标志,这意味着它只会选择与模式不匹配的行.因此,在前面的示例中,using 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 [...]
Run Code Online (Sandbox Code Playgroud)

4)很酷,现在我们有了我们需要的pid.尽管如此,我们还需要解决所有其他问题.为了做到这一点,让我们使用cut.此命令从FILE或标准输出中删除部分.-d选项是分隔符,-f是您需要的字段.大.所以我们可以使用空格('')作为分隔符,并获得第一个字段,它对应于pid.跑步ps x | grep /usr/local/tomcat/ | grep -v grep | cut -d ' ' -f 1将返回:

13277
Run Code Online (Sandbox Code Playgroud)

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

#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
Run Code Online (Sandbox Code Playgroud)

  • 详细而且答案很好.我唯一不同的是使用`awk`而不是`cut`,就像这样:`ps axuw | grep path/to/tomcat | grep -v grep | awk'{print $ 2}'` (5认同)