5

目前/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 \
)

这是相当丑陋的,取决于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

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 错误。

4

3 回答 3

16

ALSA FAQ上有这个问题的答案。在我的系统上,使用 fuser 比使用 lsof 快得多。

fuser -v /dev/snd/*
于 2009-02-08T19:09:27.883 回答
3

你在这里开始了很多进程。相反,您可以尝试以与您发布的 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

这在我的桌面上现在需要 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),但我想这更多是因为糟糕的测试方法。自己试试。

于 2009-06-19T22:15:35.887 回答
1

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

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

可能会起作用并给您一些加速,就像使用cut而不是awk.

于 2009-02-09T12:59:35.927 回答