如何仅显示睡眠过程

时间:2019-12-30 10:17:01

标签: linux bash shell process grep

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

4 个答案:

答案 0 :(得分:1)

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

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

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

答案 1 :(得分:1)

/ proc / $ PID /中有一个名为状态的文件,您可以像这样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]/}

答案 2 :(得分:1)

如果您不希望使用完整的文件名路径,而只希望使用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

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

如果您只是真的想要一个合理有效的仅bash版本,请使用Ivan的改版工具:

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

答案 3 :(得分:0)

  

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

详细了解proc(5)。每个查询进程的实用程序都经过/proc/(因为没有其他方法可以与内核交互来查询进程状态)。

但是,您应该考虑使用pgrep(1)。您要运行:

pgrep --runstates S

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