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

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

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

    目前的方式 /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的解决方案 列出打开的文件 ,也许使用/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 回复  |  直到 16 年前
        1
  •  3
  •   liori    16 年前

    这个问题的答案在 ALSA FAQ 在我的系统中,使用定影器比使用lsof快得多。

    fuser -v /dev/snd/*
    
        2
  •  13
  •   jfsantos    11 年前

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

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

        3
  •  1
  •   sparklewhiskers    16 年前

    你不会说你在寻找什么样的时间表,而是为了你的替代建议

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

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