hen*_*dry 5 linux audio shell posix alsa
目前/usr/sbin/alsaDebian中的方式知道使用声卡的过程如下:
echo $( \
lsof +D /dev -F rt \
| awk '/^p/ {pid=$1} /^t/ {type=$1} /^r0x(74|e)..$/ && type == "tCHR" {print pid}' \
| cut -c 2- \
| uniq \
)
Run Code Online (Sandbox Code Playgroud)
这是相当丑陋和依赖lsof.我正在寻找没有的POSIX解决方案lsof,也许使用/ proc.
time for i in /proc/*/fd/*; do readlink $i | grep -q /dev/snd/pcm && echo $i | awk -F '/' '{print $3}'; done | uniq
Run Code Online (Sandbox Code Playgroud)
不幸的是,似乎需要两倍于lsof上面的基本片段.你能让它更快,以使其成为可行的替代品吗?
更新我重写了以上内容:
#!/bin/sh
for i in /proc/[0-9]*/fd/*
do
if readlink $i | grep -q /dev/snd/pcm
then
IFS=/; set -- $i; unset IFS; echo $3
fi
done
Run Code Online (Sandbox Code Playgroud)
但它似乎与我之前的片段具有相同的性能.我怀疑grep是罪魁祸首.
更新:我已经打开了关于该主题的Debian错误.
jfs*_*tos 14
关于ALSA FAQ的问题有一个答案.在我的系统上,使用热熔器比使用lsof更快.
fuser -v /dev/snd/*
Run Code Online (Sandbox Code Playgroud)
您在这里启动了很多进程。相反,您可以尝试以与您发布的 lsof 脚本类似的方式进行操作...但将 lsof 替换为 shell for 循环:
如果您想避免启动大量 grep 进程,请仅启动一个:
#!/bin/sh
for i in /proc/[0-9]*/fd/*
do
echo ${i%/fd/*} $(readlink $i)
done | grep -q /dev/snd/pcm
Run Code Online (Sandbox Code Playgroud)
现在,在我的桌面上,这需要 4.5 秒,而当每个打开的文件都有一个 grep 进程时,则需要 7.5 秒。
但是......我认为你的 grep 在这里是不必要的。如果你很在意,你可以尝试:
#!/bin/sh
for i in /proc/[0-9]*/fd/*
do
var="$(readlink $i)"
if test x"$var" != x"${var#/dev/snd/pcm}"
then
echo $i
fi
done
Run Code Online (Sandbox Code Playgroud)
这对我来说甚至更快(test几乎总是内置的 shell),但我想这更多是因为糟糕的测试方法。自己尝试一下。