如何打印 Linux 上所有正在运行的进程的索引为 24 的文件描述符总数?
我试过
$ ls /proc/*/fd 2> errors.txt > stdout.txt | grep "^24" stdout.txt | wc -l
该解决方案每次都返回 0。
我提到我的任务要求我写一行代码来解决它。
答案1
你可以使用
find /proc/[0-9]*/fd/ -name 24 2> /dev/null | wc -l
或者,如果您坚持使用ls
(这应该是其中之一几个例子在安全的情况下这样做):
ls /proc/[0-9]*/fd 2>/dev/null | grep -c '^24$'
您的第一次尝试失败了,因为您将输出重定向到文件 ( > output.txt
),这意味着grep
永远不会匹配,因为它没有可匹配的输出。您可以|
像上面那样使用管道 ( ),或者使用;
或&
来分隔命令:
ls /proc/[0-9]*/fd 2> errors.txt > stdout.txt; grep "^24" stdout.txt | wc -l
答案2
ls
打电话或在这里没有意义find
。这就是 shell 通过扩展全局来完成工作。
只是:
set -- /proc/[0-9]*/fd/24 && echo "$#"
需要注意的是,除了 之外zsh
,如果您得到1
,您不知道是因为存在一个还是模式不匹配。
有了bash
,你可以做
shopt -s nullglob
fds=(/proc/[0-9]*/fd/24)
echo "${#fds[@]}"
另一种更便携的选择是使用lsof
:
lsof -td24 | wc -l