Linux 命令 grep, awk 执行疑惑

2020-07-08 16:26:09 +08:00
 fangcan
脚本如下:检测 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 能打印出进程号?
3047 次点击
所在节点    Linux
20 条回复
dingwen07
2020-07-08 16:29:14 +08:00
开调试模式看看到底执行了什么
goofool
2020-07-08 16:31:03 +08:00
你的脚本名字叫 tomcatxxx 吧
neighbads
2020-07-08 16:32:56 +08:00
tomcat 过滤一般选 java 吧,进程名不一定带 tomcat,所以直接执行返回空。

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

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

'-w' 是说匹配整个关键字
cattyhouse
2020-07-08 19:15:15 +08:00
还有你可以用 pid=$(pgrep -x tomcat)

'-x' Only match processes whose names (or command line if -f is specified) exactly match the pattern.
lululau
2020-07-08 19:54:05 +08:00
@lxk11153 launchd,前端命令是 launchctl
yangbonis
2020-07-08 20:14:01 +08:00
pidof,ps -C,cmdline 的二进制名和 comm 都不唯一的话,就让 systemd 管理吧。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/688275

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX