【发布时间】:2019-12-30 10:17:01
【问题描述】:
如何仅显示 /proc 文件中的睡眠 (S) 进程? 我只想使用 /proc/status 目录显示正在休眠的进程。 我尝试使用 egrep,但它似乎无法正常工作。
【问题讨论】:
标签: linux bash shell process grep
如何仅显示 /proc 文件中的睡眠 (S) 进程? 我只想使用 /proc/status 目录显示正在休眠的进程。 我尝试使用 egrep,但它似乎无法正常工作。
【问题讨论】:
标签: linux bash shell process grep
/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。
要列出所有进程的 pid,请使用:
ps -eo s,pid
它显示进程状态及其 PID
要仅过滤掉睡眠进程,您可以使用 awk:
ps h -eo s,pid | awk '{ if ($1 == "S") print $2; }'
【讨论】:
awk....)
ps实用程序在Linux上通过阅读proc(5)实现
如果您不想要完整的文件名路径,而只想要 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
【讨论】: