加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > Linux > 正文

linux – 使用ALSA快速查找流程

发布时间:2020-12-14 01:50:40 所属栏目:Linux 来源:网络整理
导读:目前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的P
目前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.

解决方法

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

这对我来说更快(测试几乎总是一个shell内置),但我想这更多是因为测试方法不好.试试自己吧.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读