技术解析

Linux 命令 grep, awk 执行疑惑
0
2021-06-16 17:54:22
idczone
脚本如下:检测 tomcat 是否启动,如果启动则停掉 tomcat
pid=`ps -ef|grep tomcat |grep -v grep |awk '{printf $2}'`
echo "pppp:${pid}"
if [ "$pid" != "" ] ; then
echo "shutdown tomcat ..."
... 后面省略

背景:tomcat 没有启动

步骤如下:
1. 单独拿 ps -ef|grep tomcat |grep -v grep |awk '{printf $2}' 执行返回空
2. 执行脚本 pid 却能打印出进程号

求大佬们看下 为什么 pid 能打印出进程号?
开调试模式看看到底执行了什么

你的脚本名字叫 tomcatxxx 吧

tomcat 过滤一般选 java 吧,进程名不一定带 tomcat,所以直接执行返回空。
执行脚本返回 pid 是因为 你的脚本名字是 带 tomcat 的?

脚本名是不是包含关键字 tomcat ?直接脚本里输出一下这个命中的进程 id 是属于哪个进程的就好了。

2 楼让我想起了上次有兄弟在这问,为何总有个 grep 进程每次都不一样还杀不掉。



脚本名确实包含 tomcat , 为什么有包含就不行?

找进程用 pgrep 不要用 grep



好像明白了 ..

脚本在执行本身也是进程

感谢各位大佬解答

嗯,搞清楚了 感谢

/>1. 你自己执行的 命令 /脚本 所产生的进程也会进 ps 的输出的啊,你比如`ps -ef --forest|less -S`
\_ bash
__ \_ ps -ef --forest
__ \_ less -S
假设你脚本叫 tomcat.sh ,你运行后,进程里肯定有`bash tomcat.sh`这一条, 所以你脚本里`ps -ef|grep tomcat`就会出来`bash`这个进程。应该加上一些其它关键字来进一步筛选进程,你比如说
`telnet v2ex.com 80` `telnet v2ex.com 443` 搜 443 就不能用`grep telnet`来筛选了
2. 2020 年了,找进程`grep tomcat |grep -v grep`太不优雅了,请用 pgrep/pkill

用 systemd, supervisor 之类的管理,不要重复造轮子

systemd 在 macos 里 对应哪个系统命令?

jps |grep Bootstrap |awk '{printf $1}'

systemd 不是系统命令,是自己去写 unit,然后用 systemctl 处理。
对应 macos 需要自己写 plist 文件,具体放哪我不记得了……

改一下:
pid=`ps -ef|grep -w tomcat |grep -v grep |awk '{printf $2}'`
'-w' 是说匹配整个关键字

还有你可以用 pid=$(pgrep -x tomcat)
'-x' Only match processes whose names (or command line if -f is specified) exactly match the pattern.

launchd,前端命令是 launchctl

pidof,ps -C,cmdline 的二进制名和 comm 都不唯一的话,就让 systemd 管理吧。

数据地带为您的网站提供全球顶级IDC资源
在线咨询
专属客服