我需要通过 shell 脚本检查 Tomcat 是否在我的系统中运行。如果不是,我需要捕获进程 ID 并终止 Tomcat。如何实现?
最佳答案
为了获取正在运行的进程,我使用了这个命令:
ps x | grep [full_path_to_tomcat] | grep -v grep |剪切-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/
匹配模式,我们得到 2 个条目而不是一个条目,让我们删除它。 -v
是 grep 的反向匹配标志,这意味着它将只选择与模式不匹配的行。因此,在前面的示例中,使用 ps -x | grep/usr/本地/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/本地/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
关于shell - 通过 shell 脚本检查 Tomcat 是否正在运行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11898686/