目前的方式 /usr/sbin/alsa 在 Debian 中,使用声卡的进程如下所示:

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 错误 关于这个话题。

有帮助吗?

解决方案

您在这里开始了很多的过程。相反,你可以尝试用类似的方式来您发布的lsof的脚本做......但是用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.5S需要我的桌面上,相比7.5S时,有一个为每个打开的文件grep的一个过程。

可是......你的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内置),但我想这是更多的是因为糟糕的测试方法。尝试自己。

其他提示

这个问题网上有答案 阿尔萨常见问题解答. 。在我的系统上,使用 fusionr 比使用 lsof 快得多。

fuser -v /dev/snd/*

你不说你要找什么样的时间尺度的,但你的其他建议

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

可能的工作,给你一点加快,如使用cut力量,而不是awk

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top