我需要通过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)