如何防止“ps”报告自己的进程?

Ste*_*ett 56 grep process ps

$ ps | grep django
28006 ttys004    0:01.12 /usr/bin/python bin/django celeryd --beat
51393 ttys005    0:01.45 /usr/bin/python bin/django celeryd -l INFO
51472 ttys005    0:01.29 /usr/bin/python bin/django celeryd -l INFO
51510 ttys005    0:01.89 /usr/bin/python bin/django celeryd -l INFO
51801 ttys005    0:01.83 /usr/bin/python bin/django celeryd -l INFO
53470 ttys005    0:03.97 /usr/bin/python bin/django celeryd -l INFO
53780 ttys005    0:00.00 grep django
Run Code Online (Sandbox Code Playgroud)

有没有办法防止报告最后一个进程(即与我的 ps 命令同时启动的 grep)?

(我开始尝试想出一个匹配文字但不匹配自身的正则表达式,但这似乎,嗯,不是正确的方法......)

hmo*_*liu 67

+1 @jamzed 简洁的答案,但是 OP 可能需要一些解释:

ps | grep "[d]jango"
Run Code Online (Sandbox Code Playgroud)

使用该正则表达式,您将启动一个进程,其 ps 字符串将与自身不匹配,因为正则表达式匹配"django"而不是"[d]jango". 这样,您将排除具有字符串“[d]jango”的进程,在本例中为 grep;这同样适用于 pgrep、egrep、awk、sed 等……无论您使用哪个命令来定义正则表达式。

来自 man 7 正则表达式

   A bracket expression is a list of characters enclosed in "[]".  It nor?
   mally matches any single character from the list (but see  below).   If
   the  list  begins  with  '^',  it matches any single character (but see
   below) not from the rest of the list.  If two characters  in  the  list
   are  separated  by '-', this is shorthand for the full range of charac?
   ters between those two (inclusive) in the collating sequence, for exam?
   ple,  "[0-9]" in ASCII matches any decimal digit.  It is illegal(!) for
   two ranges to share an endpoint, for example, "a-c-e".  Ranges are very
   collating-sequence-dependent,  and portable programs should avoid rely?
   ing on them.
Run Code Online (Sandbox Code Playgroud)

  • 凉爽的。我实际上对正则表达式很满意,但无法立即想出一种方法来防止正则表达式自身匹配。将字母括在方括号中非常有意义。(包括像 [^!] 这样的东西也可以...) (2认同)

jam*_*zed 30

ps | grep [d]jango

ps | grep d[j]ango

...

ps | grep djang[o]


ram*_*uma 18

改用 pgrep: pgrep -lf django


小智 18

我的答案是在ps列表中搜索“foobar”的典型答案的变体。我相信的参数"-A" "ps"比 更便携"aux",但这种变化与答案无关。典型的答案如下所示:

$ ps -A -ww | grep [f]oobar
Run Code Online (Sandbox Code Playgroud)

相反,我使用这种模式:

$ ps -A -ww | grep [^]]foobar
Run Code Online (Sandbox Code Playgroud)

主要优点是基于此模式编写脚本更容易,因为您只需将静态字符串[^]]与您要查找的任何模式连接起来。您不需要剥离字符串的第一个字母,然后将其插入方括号之间,然后再次将其连接在一起。在 shell 中编写脚本时,简单地将其[^]]放在您正在寻找的模式前面会更容易。Bash 中的字符串切片是一件丑陋的事情,所以我的变体避免了这种情况。此变体表示显示模式匹配而没有前导右方括号的行]。由于排除方括号的搜索模式实际上将方括号添加到模式中,因此它永远不会匹配自身。

所以你可以写一个可移植的psgrep命令如下。在这里,我考虑了 Linux、OS X BSD 和其他之间的差异。这添加了来自 的列标题ps,提供了更多自定义ps更适合我需要的格式,并显示进程列表额外的、额外的宽,以便不会遗漏任何命令行参数。好吧,大多数都不会错过。Java 是 Java,它通常以最糟糕的方式做事,因此您的某些 Java 服务将运行超过进程表将跟踪的最大允许参数长度。我相信这是 1024 个字符。允许启动进程的命令行长度要长得多,但内核进程表不会跟踪长度超过 1K 的任何内容。一旦命令启动,命令名和参数列表就不需要了,所以存储在进程表中的只是信息性的。

psgrep ()
{
    pattern=[^]]${1};
    case "$(uname -s)" in
        Darwin)
            ps -A -ww -o pid,ppid,nice,pri,pcpu,pmem,etime,user,wchan,stat,command | grep -i -e "^[[:space:]]*PID" -e ${pattern}
        ;;
        Linux)
            ps -A -ww -o pid,ppid,tid,nice,pri,pcpu,pmem,etime,user,wchan:20,stat,command | grep -i -e "^[[:space:]]*PID" -e ${pattern}
        ;;
        *)  # other UNIX flavors get a minimalist version.
            ps -A -ww | grep -i -e ${pattern}
        ;;
    esac
}
Run Code Online (Sandbox Code Playgroud)


Ste*_*ett 11

哦等等,这有效:

ps | grep django | grep -v grep
Run Code Online (Sandbox Code Playgroud)

  • 只有当进程命令行不合法地包含 `grep` 时,在一般情况下你不能指望它。 (7认同)

小智 8

ps -d | grep django

来自人 ps:

 -d                  Lists information  about  all  processes
                     except session leaders.
Run Code Online (Sandbox Code Playgroud)