代码之家  ›  专栏  ›  技术社区  ›  hendry

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

  •  5
  • hendry  · 技术社区  · 15 年前

    目前的方式 /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 . 我正在寻找一个没有 最小二乘法 ,可能使用/proc。

        time for i in /proc/*/fd/*; do readlink $i | grep -q /dev/snd/pcm && echo $i | awk -F '/' '{print $3}'; done | uniq
    

    不幸的是,似乎需要两倍的时间 最小二乘法 基于上面的代码段。为了使它成为一个可行的替代品,你能使它更快吗?

    更新 我重写了上述内容:

    #!/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
    

    但它的性能似乎与我之前的代码片段相同。我怀疑格雷普是罪魁祸首。

    更新:我打开了一个 Debian bug 关于这个话题。

    3 回复  |  直到 10 年前
        1
  •  3
  •   liori    15 年前

    你在这里开始了很多过程。相反,您可以尝试用类似于您发布的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 几乎总是一个外壳内置),但我想这更多是因为糟糕的测试方法。试试你自己。

        2
  •  13
  •   jfsantos    10 年前

    这个问题的答案是 ALSA FAQ . 在我的系统中,使用热熔器比使用LSOF快得多。

    fuser -v /dev/snd/*
    
        3
  •  1
  •   sparklewhiskers    15 年前

    你不是说你在找什么样的时间表,而是你的另一个建议

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

    可能会起作用,给你一点速度,就像可能使用 cut 而不是 awk .