从进程列表中排除 grep

从进程列表中排除 grep

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

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

它运行完美并返回 PID,但它还返回第二个 PID,这大概是我现在正在运行的进程。有没有办法将我的命令从返回的 PID 列表中排除?

我已经测试了几次,看来我的命令始终是列表中的第二个 PID,但我不想只抓取第一个 PID,以防它不准确。

答案1

grep 的-vswitch 反转结果,将其从队列中排除。因此,可以这样写:

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

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

ps -C daemon_name -o pid=

后者-o决定了您想要在列表中显示哪些列的信息。仅列出进程 ID 列。后面的pid等号表示该列没有列标题,因此您只能获得清晰的数字 - PID。=pid

希望这可以帮助。

答案2

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

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

我更喜欢使用这个| grep -v grep

答案3

ps如果有更可靠的替代方案,则避免解析的输出。

pgrep daemon_name
pidof daemon_name

答案4

用于pgrep通过名称查找进程的 pid:

pgrep proc_name

结果中包含额外的进程名称(-l):

pgrep -l proc_name

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

pgrep -lf proc_name_or_argument

的好处pgrep是它永远不会将自己报告为匹配项。但您不需要通过获取 pidpgrep然后通过 终止相应的进程killpkill而是使用:

pkill proc_name

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

pkill -9 proc_name

查找进程名称 ( -l) 和参数 ( ),然后在通过信号 (或)终止进程之前-f请求确认 ( ) :-ISIGKILL-9-KILL

pkill -KILL -Ilf proc_name_or_argument

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

相关内容