我有 2 个 tomcat 正在运行,如果两个 tomcat 有相似的名称,我该如何获取 pid?
ps -ef | grep java
root 12952 1 0 10:01 pts/0 00:00:03 /usr/lib/jvm/jre/bin/java -Djava.util.logging.config.file=/usr/local/realbid/tomcat-realbid-ws/conf/logging.properties -Djava.util.logging.manager=org.apache.juli.ClassLoaderLogManager -Djava.endorsed.dirs=/usr/local/realbid/tomcat-realbid-ws/endorsed -classpath /usr/local/realbid/tomcat-realbid-ws/bin/bootstrap.jar -Dcatalina.base=/usr/local/realbid/tomcat-realbid-ws -Dcatalina.home=/usr/local/realbid/tomcat-realbid-ws -Djava.io.tmpdir=/usr/local/realbid/tomcat-realbid-ws/temp org.apache.catalina.startup.Bootstrap start
root 12995 1 0 10:02 pts/0 00:00:03 /usr/lib/jvm/jre/bin/java -Djava.util.logging.config.file=/usr/local/realbid/tomcat-realbid/conf/logging.properties -Djava.util.logging.manager=org.apache.juli.ClassLoaderLogManager -Djava.endorsed.dirs=/usr/local/realbid/tomcat-realbid/endorsed -classpath /usr/local/realbid/tomcat-realbid/bin/bootstrap.jar -Dcatalina.base=/usr/local/realbid/tomcat-realbid -Dcatalina.home=/usr/local/realbid/tomcat-realbid -Djava.io.tmpdir=/usr/local/realbid/tomcat-realbid/temp org.apache.catalina.startup.Bootstrap start
root 13317 12252 0 10:12 pts/0 00:00:00 grep java
如果我使用基本 grep 我会得到 pid
echo `ps aux | grep 'tomcat-realbid' | grep -v grep | awk '{ print $2 }'`
12952 12995
有没有办法只获取 pid tomcat-realbid
?
答案1
您可以使用逆 grep,因此也许:
ps aux | grep 'tomcat-realbid' | grep -v 'tomcat-realbid-ws'
这基本上会过滤带有 tomcat-realbid 的进程,然后再次过滤,删除任何带有 tomcat-realbid-ws 的进程,您已经使用逆向 grep 来删除原始 grep。最终结果可能如下所示:
echo ps aux | grep 'tomcat-realbid' | grep -v 'tomcat-realbid-ws' | grep -v grep | awk '{ print $2 }'
答案2
尝试
ps auxwww | grep "/tomcat-realbid/"
答案3
稍微简短一点:
pgrep 'tomcat-realbid[^(-ws)]*$'
搜索tomcat-realbid
不带结尾的-ws
并打印 pid。
答案4
通常awk
可以做什么grep
,因此您只需一个命令即可加入所有命令:
ps -ef | awk '/java/ && /tomcat-realbid / {print $2}'
java
这将获取所有包含和的行tomcat-realbid
(请注意末尾的空格,这样才能获取所需的行)。对于那些匹配的行,它会打印其第二个字段。