如何在bash中使用pgrep指定命令行参数?

8

我有几个进程使用相同的名称但具有不同的命令行参数。

$ ps -ef | grep process_name 
myusername 19276 6408 0 18:12 pts/22 00.00.00 process_name 4010 127.0.0.1
myusername 23242 6369 0 18:32 pts/11 00.00.00 process_name 4010 127.0.0.2

如何根据进程的完整名称获取进程ID,例如process_name 4010 127.0.0.1

我尝试使用pgrep,但它似乎不会查找参数。

$ pid=$(pgrep process_name) 
19276 23242
$ pid=$(pgrep process_name 4010 127.0.0.1) #error
$ pid=$(pgrep "process_name 4010 127.0.0.1") #blank
$ pid=$(pgrep "process_name\s4010\s127.0.0.1") #blank
$ pid=$(pgrep "process_name[[:space:]]4010[[:space:]]127.0.0.1") #blank
1个回答

10

使用-f选项来匹配完整的命令行:

pgrep -f 'process_name 4010 127.0.0.1'

这也会匹配上 subprocess_name 4010 127.0.0.11。如果你想避免这种情况,可以使用 ^ 来锚定匹配的开头,$ 来锚定匹配的结尾:

pgrep -f '^process_name 4010 127.0.0.1$'

文档

man pgrep中得知:

-f,--full
通常只对进程名称进行模式匹配。当使用-f时,将使用完整的命令行。


1
使用-x代替--exact以避免插入符号(^)。 - chzzh

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接