Linux 使用ALSA快速查找进程
目前,Debian中Linux 使用ALSA快速查找进程,linux,shell,audio,posix,alsa,Linux,Shell,Audio,Posix,Alsa,目前,Debian中/usr/sbin/alsa了解声卡使用过程的方式如下: echo $( \ lsof +D /dev -F rt \ | awk '/^p/ {pid=$1} /^t/ {type=$1} /^r0x(74|e)..$/ && type == "tCHR" {print pid}' \ | cut -c 2- \ | uniq \ ) 这相当难看,取决于lsof。我正在寻找一个没有lsof的POSIX解决方案,可能使用/pr
/usr/sbin/alsa
了解声卡使用过程的方式如下:
echo $( \
lsof +D /dev -F rt \
| awk '/^p/ {pid=$1} /^t/ {type=$1} /^r0x(74|e)..$/ && type == "tCHR" {print pid}' \
| cut -c 2- \
| uniq \
)
这相当难看,取决于lsof
。我正在寻找一个没有lsof的POSIX解决方案,可能使用/proc
time for i in /proc/*/fd/*; do readlink $i | grep -q /dev/snd/pcm && echo $i | awk -F '/' '{print $3}'; done | uniq
不幸的是,这似乎是上面基于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
但它的性能似乎与我前面的代码片段相同。我怀疑格雷普是罪魁祸首
更新:我已经打开了一个关于这个主题的讨论。这个问题的答案在网站上。在我的系统上,使用fuser比使用lsof快得多
fuser -v /dev/snd/*
你没有说你在寻找什么样的时间尺度,而是在寻找你的替代建议
for i in /proc/[0-9]*/fd/*;
可能会起作用并给您带来一点速度,就像使用
cut
而不是awk
一样,您可以在这里启动很多流程。相反,您可以尝试以类似于您发布的lsof脚本的方式执行。。。但将lsof替换为shell for loop:
如果要避免启动大量grep进程,请只启动一个:
#!/bin/sh
for i in /proc/[0-9]*/fd/*
do
echo ${i%/fd/*} $(readlink $i)
done | grep -q /dev/snd/pcm
现在我的桌面上需要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
这对我来说更快(
test
几乎总是一个shell内置),但我想这更多是因为糟糕的测试方法。自己试试。定影器
速度很快,但取决于时间。我试图摆脱依赖关系,而不是用另一个来取代依赖关系。:-)ALSA FAQ链接已断开。我5年前发布的FAQ URL来自一个非官方的FAQ,不幸的是,它已经不存在了。这就是2009年的情况:/proc不是POSIX的一部分,据我所知。当我说POSIX时,我的意思是shell代码应该能够在dash之类的任何shell上运行。例如。/bin/posh——这就是我的意思:}在我的测试中,该代码比其他shell快3倍。太好了,谢谢!我错误地避免了参数扩展。