从进程列表中排除grep


27

我拼凑了一个命令,以返回正在运行的守护程序的进程ID:

ps aux | grep daemon_name | awk "{ print \$2 }"

它可以完美工作并返回PID,但也返回第二个PID,大概是我现在正在运行的进程。有什么方法可以将我的命令从返回的PID列表中排除吗?

我已经对其进行了几次测试,看来我的命令始终是列表中的第二个PID,但是我不想只获取第一个PID以防不正确。


Answers:


27

grep的-v开关会反转结果,将其从队列中排除。因此,使其像:

ps aux | grep daemon_name | grep -v "grep daemon_name" | awk "{ print \$2 }"

更新。您还可以使用-Cswitch来指定命令名称,如下所示:

ps -C daemon_name -o pid=

后者-o确定您要在清单中的信息的哪些列。pid仅列出进程ID列。而等号=pid意味着将是一个没有列标题,所以你只有明确数据- PID的。

希望这可以帮助。


2
使用“ grep -v grep”:请注意,您可能有一个较长的命令行,其中包括“ grep”(假设有人编写了一个grep库=>“ -Llibgrep.so”或“ -cp libgrep.jar”。至少我会重复这种模式:grep -v“ grep daemon_name”
phil_w 2015年

好点,@ phil_w,谢谢。更新了答案。
Serg ikS 2015年

23

您可以使用字符类技巧。“ [d]”与“ [d]”仅与“ d”不匹配。

 ps aux | grep [d]aemon_name | awk "{ print \$2 }"

我更喜欢使用| grep -v grep


嘿,这是一个聪明的把戏,我喜欢。虽然目前我正在学习,但我| grep -v grep仍将事情保持简单,并且当我重新访问代码时将更容易理解。
tak 2012年

我正在尝试了解此[hack]的工作原理。你能解释一下你的意思"[d]" does not match "[d]" only "d"吗?
Nowaker

@Damian:方括号是搜索表达式中的元字符(定界了一组字符),因此grep命令将与命令本身的ps输出行不匹配grep(在原始问题中,tak称为“第二个PID”)。表达a[xy]d没有匹配的文字a[xy]d,但它确实匹配的文本axd或文本ayd。因此,表达式[f]oo匹配文本,foo但不匹配text [f]oo。我希望这很清楚。
RedGrittyBrick

好的,我对ARGV错了。这只是一个正则表达式。谢谢。
Nowaker

异常聪明!不得不考虑一下-谢谢!
Subfuzion

15

ps如果有更可靠的选择,请避免解析输出。

pgrep daemon_name
pidof daemon_name

是的,现在过程管理终于有意义了。
Błażej米哈利克

pgreppidof完全匹配时,按子字符串搜索-我需要什么!谢谢!
萨沙

3

ps -C选项并非在所有基于Unix的系统上都通用,但是如果它在您的系统上可用。相反,我将完全避免使用grep:

ps aux | awk '/daemon_name/ && !/awk/ { print $2 }'

无需在单引号中转义任何内容。 ps aux将为您提供大多数基于Unix的系统上的进程的完整列表,并且awk通常默认情况下安装。


3

使用pgrep查找按名称进程的PID:

pgrep proc_name

在结果(-l)中带有额外的进程名称:

pgrep -l proc_name

查找并显示进程名称(-l)和参数(-f):

pgrep -lf proc_name_or_argument

好处pgrep是它永远不会将自己报告为匹配项。但是您不需要通过pid pgrep,然后通过杀死相应的进程kill。使用pkill来代替:

pkill proc_name

指定SIGKILL信号(-9-KILL),而不是SIGTERM(默认情况下):

pkill -9 proc_name

查找进程名称(-l)和参数(-f),-I在通过SIGKILL信号(-9-KILL)将其杀死之前,先进行确认():

pkill -KILL -Ilf proc_name_or_argument

注意,该-I选项仅在某些版本上可用pkill,例如OS X Mavericks上的版本。


0

如果您使用的是bash,还可以通过以下方式通过以下方式进行操作: ps -eaf

PIDS=$(ps -eaf)
PID=$(echo "$PIDS" | grep "process_name" | awk '{print $2}')
echo $PID

这是不必要的复杂。为什么不能简单地调用ps -eaf | grep "process_name" | awk '{print $2}'
大卫Nedrow

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.