Linux 使用ALSA快速查找进程

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

目前,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解决方案,可能使用/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倍。太好了,谢谢!我错误地避免了参数扩展。