使用ALSA查找流程听起来很快

时间:2009-02-08 18:07:11

标签: 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解决方案,可能使用/ 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

但它似乎与我早期的片段具有相同的性能。我怀疑grep是罪魁祸首。

更新:我已就该主题打开Debian bug

3 个答案:

答案 0 :(得分:14)

ALSA FAQ上有这个问题的答案。在我的系统上,使用热熔器比使用lsof更快。

fuser -v /dev/snd/*

答案 1 :(得分:3)

你在这里开始了很多流程。相反,您可以尝试以与您发布的lsof脚本类似的方式进行操作...但是用shell替换lsof for循环:

如果您想避免启动大量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),但我想这更多是因为测试方法不好。试试吧。

答案 2 :(得分:1)

你没有说你正在寻找什么样的时间表,而是你的替代建议

for i in /proc/[0-9]*/fd/*;

可能有用,可以提高您的使用速度,就像使用cut而不是awk一样。