【问题标题】:How to show only sleeping processes如何仅显示睡眠进程
【发布时间】:2019-12-30 10:17:01
【问题描述】:

如何仅显示 /proc 文件中的睡眠 (S) 进程? 我只想使用 /proc/status 目录显示正在休眠的进程。 我尝试使用 egrep,但它似乎无法正常工作。

【问题讨论】:

    标签: linux bash shell process grep


    【解决方案1】:

    /proc/$PID/中有一个名为status的文件,你可以这样grep它

    status=sleeping
    
    for pid in /proc/[0-9]*; {
        state=$(grep $status $pid/status)
        [[ $state ]] && echo ${pid//'/proc/'/}
    }
    

    或者使用变量替换

    pids=( $(grep -l $status /proc/*/status) ); echo ${pids[@]//[!0-9]/}
    

    【讨论】:

    • 只需grep -l sleeping /proc/[0-9]*/status,也可以通过| xargs -n1 dirname | xargs -n1 basename 或类似的方式进行管道传输。循环和检查返回值和echo 会很慢。不鼓励使用 { } 而不是 do done - 这是一个(奇怪的)bash 扩展,只是 do done
    【解决方案2】:

    要列出所有进程的 pid,请使用: ps -eo s,pid 它显示进程状态及其 PID

    要仅过滤掉睡眠进程,您可以使用 awk:

    ps h -eo s,pid | awk '{ if ($1 == "S") print $2; }'

    【讨论】:

    • 感谢您的回答!有什么办法可以用 proc 目录做到这一点?
    • @user08:现在应该了。这个错字很容易纠正(一旦你阅读了documentation of GNU awk....)
    • @user08:标准的ps实用程序在Linux上通过阅读proc(5)实现
    【解决方案3】:

    如果您不想要完整的文件名路径,而只想要 PID,请尝试 awk

    $: awk '/sleeping/{ $0=FILENAME; gsub(/[^0-9]/, ""); print $0 }' /proc/[0-9]*/status
    

    这是一个单一的、高效的进程,可以跨所有文件运行,并且只输出一组适合捕获到数组中的 PID。

    当然,如果您愿意,您也可以通过这种方式获得完整路径 -

    $: awk '/sleeping/{ print FILENAME }' /proc/[0-9]*/status
    

    或使用sed

    $: sed -n '/sleeping/F'  /proc/[0-9]*/status
    

    但这些基本上只是与KamilCuk 建议的grep -l sleeping /proc/[0-9]*/status 做同样的事情。

    如果您真的想要一个相当高效的纯 bash 版本,这里是 Ivan 的重新工具:

    $: for proc in /proc/[0-9]*/status
       do case "$(<$proc)" in
          *sleeping*) echo "${proc//[^0-9]/}" ;;
          esac
       done
    

    【讨论】:

      【解决方案4】:

      如何仅显示 /proc 文件中的睡眠 (S) 进程?

      阅读有关proc(5) 的更多信息。每个查询进程的实用程序都通过/proc/(因为没有其他方法可以与内核交互来查询进程状态)。

      但是,您应该考虑使用pgrep(1)。你想跑:

      pgrep --runstates S
      

      但您可能需要从源代码编译procps-ng(因为您需要版本 3.3.16)

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-08-31
        • 1970-01-01
        • 2011-01-16
        • 1970-01-01
        • 2010-12-04
        相关资源
        最近更新 更多