【问题标题】:What do I do instead of grep'ing the output of ps?我该怎么做而不是grep'ing ps的输出?
【发布时间】:2013-03-12 18:47:44
【问题描述】:

每个人都知道这有多烦人:

[mybox:~ #] ps aux | grep myservice
root      2273  0.0  0.0   4360   760 ?        Ss   18:06   0:00 /usr/sbin/myservice
root     18590  0.0  0.0   4100   788 pts/2    S+   21:21   0:00 grep myservice

你得到你正在寻找的进程,加上 grep。所以,好吧,你可以这样做:

[mybox:~ #] ps aux | grep myservice | grep -v grep
root      2273  0.0  0.0   4360   760 ?        Ss   18:06   0:00 /usr/sbin/myservice

[mybox:~ #] pgrep myservice
2273

但前者是 3 个完整的命令,而后者只为您获取进程 ID。有更好的选择吗?

【问题讨论】:

    标签: shell grep shortcut idioms ps


    【解决方案1】:

    ps + pgrep 也许?

    $ ps -fp $(pgrep myservice)
    UID    PID  PPID  C STIME TTY  TIME      CMD
    user   5422  5315  0 15:37 ?   00:00:04  /usr/bin/myservice
    

    【讨论】:

    • 如果进程没有运行,这会导致错误。
    • 确实如此。您始终可以重定向错误,以避免噪音 (2> /dev/null),或将 pgrep 的输出保存在变量中,以便在 ps 之前检查它。
    【解决方案2】:

    如果你现在的进程全名

    ps -F -C myservice
    

    但它不适用于myserv of 'myserv*'

    如果你只知道一个部分,你可以将你的命令减少到 2 个:

    ps aux | grep [m]yserv
    

    【讨论】:

    • -p $(pgrep myserv) 而不是 -C myservice
    • 我的想法是减少命令,但仍然是 2。
    【解决方案3】:

    如何将管道命令存储到一个带有位置参数的小型 bash shell 中?如果这是目标,这将减少击键。

    [mybox:~ #] cat mycmd
        #!/bin/bash
        ps aux | grep $1 | grep -v grep
    

    可以这样称呼:

    [mybox:~ #] mycmd myservice
      root      2273  0.0  0.0   4360   760 ?        Ss   18:06   0:00 /usr/sbin/myservice
    

    【讨论】:

    • 这是个好主意,但是: 1. 如果你这样做,你必须记住另一个 shell 命令 2. 如果它不是你的系统,并且你没有个人帐户,留下可执行文件周围的脚本不礼貌。得到了你的支持...
    猜你喜欢
    • 1970-01-01
    • 2020-02-29
    • 2018-01-16
    • 1970-01-01
    • 2012-05-26
    • 1970-01-01
    • 1970-01-01
    • 2014-01-23
    • 2011-05-17
    相关资源
    最近更新 更多