日常操作linux 中,通常在使用 ps命令后 用管道连接 查询特定进程会显示 grep进程本身。
如下:
1 [[email protected] ~]# ps -ef|grep gs4 2 root 6284 5879 0 14:30 pts/0 00:00:00 grep --color=auto gs4
1 [[email protected] gs4]# ps axu |grep gs4 2 root 2480 0.0 0.0 112728 972 pts/0 S+ 14:20 0:00 grep --color=auto gs4
上述查询,查询结果其实 都是没有 gs4这个进程。但是都显示了 grep进程的本身。
这样,对于初学者,可能并不太友好。有的人会认为这就是自己想要的 进程,结果用 kill -9 PID 时提示进程号不存在.......
如何判断时 grep进程本身? 看下方指令,你就会明白了。(橙色标注。)
进程号一直的变的那个进程是 grep进程本身,正常进程号 也就是PID不会变。
1 [[email protected] ~]# ps -ef|grep gs4 2 root 16455 9998 0 16:19 pts/0 00:00:00 grep --color=auto gs4 3 [[email protected] ~]# ps -ef|grep gs4 4 root 16493 9998 0 16:19 pts/0 00:00:00 grep --color=auto gs4 5 [[email protected] ~]# ps -ef|grep gs4 6 root 16531 9998 0 16:19 pts/0 00:00:00 grep --color=auto gs4
解决的办法:
过滤掉grep进程本身的输出:
方法 一:在进程名 任何一个字母上添加 [ ]
1 [[email protected] ~]# ps -ef|grep gs4 2 root 13233 5879 0 14:59 pts/0 00:00:00 grep --color=auto gs4 3 [[email protected] ~]# ps -ef|grep g[s]4 4 [[email protected] ~]#
浅析:
ps -ef |grep g[s]4 不会出现 grep进程本身。因为字母加上 [ ] 后,此时 grep进程的参数是 grep --color=auto g[s]4;(注意看和上图的区别!!!)
而 grep g[s]4 正则表达式 匹配的是 ‘gs4‘ 这个字符串,因此这个 grep g[s]4 正则表达式 并不能匹配到 ‘ g[s]4‘ 这个字符串。(也就是grep的进程)
所以自然不会出现grep进程本身。
小建议: 用 grep正则表达式 过滤出进程 有时不可靠,操作不好可能会出现,进程的误杀。
建议用 pgrep命令 能正确过滤出 你想要的进程,不会误杀死其他进程。
方法二: 在进程 后面 + grep -v grep
-v 参数含义为不包括
[[email protected] ~]# ps -ef|grep g[s]4|grep -v grep [[email protected] ~]#
希望可以帮到你。
by不言谢。
原文地址:https://www.cnblogs.com/byx1024/p/12228735.html
时间: 2024-10-30 07:58:30