【问题标题】:top -c command in linux to filter processes listed based on processnamelinux中的top -c命令过滤基于进程名列出的进程
【发布时间】:2012-08-18 00:32:02
【问题描述】:
top -c

顶部列出了所有进程,有很好的选项可以使用选项 -u 按用户名过滤进程,但我想知道是否有任何简单的方法可以根据顶部输出的 COMMAND 列下列出的进程名称来过滤进程.

例如,我想要 top -some option -substring of processname 和 top 显示仅在其命令名称中包含此子字符串的 pids

【问题讨论】:

    标签: linux unix process top-command


    【解决方案1】:

    使用 pgrep 获取匹配命令行的 pid:

    top -c -p $(pgrep -d',' -f string_to_match_in_cmd_line)
    

    top -p 需要一个逗号分隔的 pid 列表,因此我们在 pgrep 中使用 -d','。 pgrep 中的-f 标志使其匹配命令行而不是程序名称。

    【讨论】:

    • 请记住,如果为 'string_to_match_in_cmd_line' 生成了新进程,它们将不会显示在顶部;您必须退出 top 并重新运行此命令
    • 正如 eugenevd 所说,这对于调用 top 后启动的新进程不起作用。有什么办法吗?我需要运行几个名称具有相同前缀的程序,我很想看看其中有多少以实时方式运行,而不需要每次都执行一个新的顶部(或只是一个 ps)。
    • @Jester,eugenevd,我遇到了和你一样的问题。我在stackoverflow.com/a/27653841/681830 制作了一个新版本,希望对您有所帮助。
    • 我遇到了top: pid limit (20) exceeded 所以我用了这个:top -c -p $(pgrep -f string_to_match_in_cmd_line | head -20 | tr "\\n" "," | sed 's/,$//')
    【解决方案2】:

    可以交互完成

    运行 top -c 后,点击 o 并在列上编写过滤器,例如要显示 COMMAND 列包含字符串 foo 的行,请写入 COMMAND=foo

    如果您只想要一些基本输出,这可能就足够了:

    top -bc |grep name_of_process
    

    【讨论】:

    • 这给了我'无效的选项或语法:-bc'
    • top -bc -n 1 更方便,因为它将迭代次数限制为 1。
    • 这应该是公认的答案。它更准确,仅适用于“top”命令提供的选项。它确实显示了新的流程。
    • 进程不断消失,然后用top -c , hit o and write a filter on a column重新出现。
    【解决方案3】:

    您可以在 top 运行时添加过滤器。只需按 o 键,然后输入过滤器表达式。

    例如,要监视包含字符串“java”的所有进程,请使用过滤表达式COMMAND=java

    您可以通过再次按o来添加多个过滤器。

    您可以使用 u 按用户过滤。使用 = 清除所有过滤器。

    【讨论】:

    • 这是一个比公认答案更好的解决方案(这个解决方案比原来的解决方案晚了 3 年)。与原来的不同,这个解决方案实际上也适用于新产生的进程。如果您要监控按需创建的 Apache 进程,这一点非常重要。
    • 确实是一个更好的解决方案,因为它可以实时过滤。接受的解决方案在运行 top 之前解析进程 ID。结果过程就像top -c -p 920,1345,1346 一样是固定的。
    • 使用o作为过滤器在一些(旧)版本的top中不存在:top: procps version 3.2.8用户过滤器存在,所以它确实有效。
    • 我认为过滤器是默认的。如何制作或
    • 有什么方法可以保存我的过滤器选项,或者从命令行调用像CPU>0.0 这样的过滤器?
    【解决方案4】:

    @perreal 的命令效果很好!如果您忘记了,请分两步尝试...

    示例:过滤顶部以仅显示名为 yakuake 的应用程序:

    $ pgrep yakuake
    1755
    
    $ top -p 1755
    

    有用的顶级交互命令 'c' :切换完整路径与命令名称 'k' : 被 PID 杀死 'F' :过滤方式...用箭头选择...然后按's'设置排序

    下面的答案也很好......我今天正在寻找但找不到它。谢谢

    【讨论】:

      【解决方案5】:

      在 StackOverflow 上寻找了这么多答案后,我还没有找到适合我需要的答案。

      也就是说,让top命令用给定的关键字不断刷新,我们不必在新进程产生时一次又一次地CTRL+C / top。

      于是我做了一个新的...

      这里是无需重启的版本。

      __keyword=name_of_process; (while :; do __arg=$(pgrep -d',' -f $__keyword); if [ -z "$__arg" ]; then top -u 65536 -n 1; else top -c -n 1 -p $__arg; fi; sleep 1; done;)
      

      修改 __keyword 应该可以了。 (Ubuntu 2.6.38 测试)

      2.14.2015 添加: 上面的代码缺少系统工作负载部分。 对于关心“平均负载”部分的人:

      __keyword=name_of_process; (while :; do __arg=$(pgrep -d',' -f $__keyword); if [ -z "$__arg" ]; then top -u 65536 -n 1; else top -c -n 1 -p $__arg; fi; uptime; sleep 1; done;)
      

      【讨论】:

      • 这缺少有关系统工作负载的概述。在睡眠前添加“正常运行时间”,对于简短的进程列表,恕我直言,这就足够了。
      • @Sevyls 感谢您的指出!经过其他几次尝试(效果不如),您的版本可能是最好的版本之一。答案已修改。
      • 如果我有一个或多个进程在运行该匹配项,但当所有进程停止时我得到一个“顶部:无效用户”时效果很好。当另一个进程启动时它会恢复。我在 Raspbian FYI 上运行。谢谢。
      【解决方案6】:

      htop,你可以简单地搜索

      /process-name
      

      【讨论】:

      • 很遗憾,htop 并非始终可用,您可能无权添加它。
      【解决方案7】:

      我最终使用了一个带有以下代码的 shell 脚本:

      #!/bin/bash
      
      while [ 1 == 1 ]
      do
          clear
          ps auxf |grep -ve "grep" |grep -E "MSG[^\ ]*" --color=auto
          sleep 5
      done
      

      【讨论】:

        【解决方案8】:

        当进程列表超过 20 个进程时,大多数答案都失败了。那是top -p 选项限制。 对于那些不支持使用o 选项过滤的旧顶部的用户,这里有一个可编写脚本的示例来获取全屏/控制台输出(此输出中缺少摘要信息)。

        __keyword="YOUR_FILTER" ; ( FILL=""; for i in  $( seq 1 $(stty size|cut -f1 -d" ")); do FILL=$'\n'$FILL; done ;  while :; do HSIZE=$(( $(stty size|cut -f1 -d" ")  - 1 ));  (top -bcn1 | grep "$__keyword"; echo "$FILL" )|head -n$HSIZE; sleep 1;done )
        

        一些解释

        __keyword = your grep filter keyword
        HSIZE=console height
        FILL=new lines to fill the screen if list is shorter than console height
        top -bcn1 = batch, full commandline, repeat once
        

        【讨论】:

          【解决方案9】:

          这个呢?

          top -c -p <PID>
          

          【讨论】:

          • 我们正在尝试按进程名(或其子字符串)进行过滤,当您重新启动进程时,您将获得一个新的 pid。
          【解决方案10】:

          此期望脚本将按名称过滤进程并显示新创建的进程。它基本上是通过为您发送 'o' 和 'COMMMAND=my_program' 来自动化用户与 top 的交互。类似于@nos 答案。

          文件:topname.exp

          #!/usr/bin/expect -- 
          
          if {[llength $argv] < 1 } {
            send_user "Usage: topname process_name top_cmd_args \n"
            exit 1
          }
          set keyword [lindex $argv 0]
          
          spawn top {*}[lrange $argv 1 end]
          
          
          expect {
          
              -re .
               {
                  send "o\r"
                  expect "*add filter*"
                  send "COMMAND=${keyword}\r"
                  interact
              }
              
          }
          

          所以你会像这样使用它:

          ./topname.exp my_program

          ./topname.exp java # this filters java processes

          它还传递了 top 接受的其他标志,例如 -u 例如

          ./topname.exp java -u root # this filters java processes by root user

          ./topname.exp java -u root -d 1 # this filters java processes by root user and delay top update by 1 second

          【讨论】:

            【解决方案11】:

            对于 Mac 上的任何人,其中 top 不支持其他答案中显示的那种过滤(并且 pgrep args 略有不同)...此函数将为匹配第一个 arg 中的模式的进程启动 top (根据 pgrep),并将任何其他参数传递给顶部。

            function topnamed() {
                name=$1
                shift
                top -pid $(pgrep -d ' -pid ' -fi "$name") 99999999 $@
            }
            

            (“-fi”中的“i”使其不区分大小写。)

            显示任何“python”进程的基本示例:

            topnamed python
            

            顶部附加参数的示例:

            topnamed python -o mem
            

            除非我遗漏了一些东西,否则 pgrep(至少在当前版本的 MacOS 中)会添加一个尾随分隔符,即使手册页上说它是“要在每个之间打印”。所以 最后的 99999999 是一个虚拟值,以防止它爆炸。 (也许有更好的解决方法。)

            它的缺点(在其他答案中提到)仅包括启动时的进程。

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 2015-01-21
              • 2012-12-15
              • 2016-10-29
              • 2011-04-13
              • 1970-01-01
              • 2021-12-10
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多