从进程列表中排除 grep

tak*_*tak 28 grep pid ps

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

ps aux | grep daemon_name | awk "{ print \$2 }"
Run Code Online (Sandbox Code Playgroud)

它完美地工作并返回PID,但它也返回第二个PID,这可能是我现在正在运行的进程。有没有办法从返回的 PID 列表中排除我的命令?

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

Ser*_*ikS 28

grep 的-v开关反转结果,将其从队列中排除。所以让它像:

ps aux | grep daemon_name | grep -v "grep daemon_name" | awk "{ print \$2 }"
Run Code Online (Sandbox Code Playgroud)

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

ps -C daemon_name -o pid=
Run Code Online (Sandbox Code Playgroud)

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

希望这可以帮助。

  • 使用“grep -v grep”:注意你可能有一个很长的命令行,包括“grep”(假设有人写了一个grep库=>“-Llibgrep.so”或“-cp libgrep.jar”。至少我会重复这个模式:grep -v "grep daemon_name" (2认同)

Red*_*ick 24

您可以使用字符类技巧。"[d]" 不匹配 "[d]" 只匹配 "d"。

 ps aux | grep [d]aemon_name | awk "{ print \$2 }"
Run Code Online (Sandbox Code Playgroud)

我更喜欢这个而不是使用| grep -v grep.

  • @Damian:方括号是搜索表达式中的*元字符*(分隔一组字符),因此 `grep` 命令不会与 `grep` 命令本身的 `ps` 输出行匹配(tak 称之为“a原始问题中的第二个 PID”)。表达式“a[xy]d”**不**匹配文本“a[xy]d”,但它匹配文本“axd”或文本“ayd”。因此,表达式“[f]oo”匹配文本“foo”,但不匹配文本“[f]oo”。我希望这是清楚的。 (2认同)

use*_*686 16

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

pgrep daemon_name
pidof daemon_name
Run Code Online (Sandbox Code Playgroud)