fangcan
V2EX  ›  Linux

Linux 命令 grep, awk 执行疑惑

By fangcan at 2020 年 7 月 8 日 · 4192 次点击
脚本如下:检测 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 能打印出进程号?
20 条回复  •  2020-07-08 20:14:01 +08:00
dingwen07
   1
dingwen07  
   2020 年 7 月 8 日   ❤️ 1
开调试模式看看到底执行了什么
goofool
   2
goofool  
   2020 年 7 月 8 日 via Android   ❤️ 1
你的脚本名字叫 tomcatxxx 吧
neighbads
   3
neighbads  
   2020 年 7 月 8 日   ❤️ 1
tomcat 过滤一般选 java 吧,进程名不一定带 tomcat,所以直接执行返回空。

执行脚本返回 pid 是因为 你的脚本名字是 带 tomcat 的?
senninha
   4
senninha  
   2020 年 7 月 8 日   ❤️ 1
脚本名是不是包含关键字 tomcat ?直接脚本里输出一下这个命中的进程 id 是属于哪个进程的就好了。
singerll
   5
singerll  
   2020 年 7 月 8 日 via Android
2 楼让我想起了上次有兄弟在这问,为何总有个 grep 进程每次都不一样还杀不掉。
fangcan
   6
fangcan  
OP
   2020 年 7 月 8 日
@goofool
@senninha
脚本名确实包含 tomcat , 为什么有包含就不行?
kiwi95
   7
kiwi95  
   2020 年 7 月 8 日 via iPhone   ❤️ 1
找进程用 pgrep 不要用 grep
fangcan
   8
fangcan  
OP
   2020 年 7 月 8 日
@goofool
@senninha
好像明白了 ..
kiwi95
   9
kiwi95  
   2020 年 7 月 8 日 via iPhone
@fangcan 脚本在执行本身也是进程
fangcan
   10
fangcan  
OP
   2020 年 7 月 8 日
感谢各位大佬解答
fangcan
   11
fangcan  
OP
   2020 年 7 月 8 日
@kiwi95 嗯,搞清楚了 感谢
lxk11153
   12
lxk11153  
   2020 年 7 月 8 日
@fangcan #6
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
lululau
   13
lululau  
   2020 年 7 月 8 日
用 systemd, supervisor 之类的管理,不要重复造轮子
lxk11153
   14
lxk11153  
   2020 年 7 月 8 日
@lululau #13 systemd 在 macos 里 对应哪个系统命令?
Superheroes
   15
Superheroes  
   2020 年 7 月 8 日
jps |grep Bootstrap |awk '{printf $1}'
no1xsyzy
   16
no1xsyzy  
   2020 年 7 月 8 日
@lxk11153 #14 systemd 不是系统命令,是自己去写 unit,然后用 systemctl 处理。
对应 macos 需要自己写 plist 文件,具体放哪我不记得了……
cattyhouse
   17
cattyhouse  
   2020 年 7 月 8 日
改一下:

pid=`ps -ef|grep -w tomcat |grep -v grep |awk '{printf $2}'`

'-w' 是说匹配整个关键字
cattyhouse
   18
cattyhouse  
   2020 年 7 月 8 日
还有你可以用 pid=$(pgrep -x tomcat)

'-x' Only match processes whose names (or command line if -f is specified) exactly match the pattern.
lululau
   19
lululau  
   2020 年 7 月 8 日 via iPhone
@lxk11153 launchd,前端命令是 launchctl
yangbonis
   20
yangbonis  
   2020 年 7 月 8 日 via iPhone
pidof,ps -C,cmdline 的二进制名和 comm 都不唯一的话,就让 systemd 管理吧。
Distributions
› Ubuntu
› Fedora
› CentOS
中文资源站
› 网易开源镜像站
© 2026 V2EX · 148ms · 3.9.8.5