Pergunta

Atualmente, a maneira /usr/sbin/alsa no Debian conhece os processos usando a aparência da placa de som como:

echo $( \
    lsof +D /dev -F rt \
    | awk '/^p/ {pid=$1} /^t/ {type=$1} /^r0x(74|e)..$/ && type == "tCHR" {print pid}' \
    | cut -c 2- \
    | uniq \
)

O que é feio e depende lsof. Eu estou procurando uma solução POSIX sem lsof, talvez usando / proc.

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

Infelizmente parece demorar o dobro do tempo como o lsof baseado trecho acima. você pode torná-lo mais rápido, a fim de torná-lo um substituto viável?

Atualizar eu reescrevi o acima como:

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

Mas parece ter o mesmo desempenho que o meu trecho anteriormente. I grep suspeito é o culpado.

Update: Eu abri uma Debian bug em o tema.

Foi útil?

Solução

Você começa um monte de processos aqui. Em vez disso você pode tentar fazer de uma forma semelhante ao script lsof você postou ... mas substituindo lsof por um escudo para loop:

Se você quer evitar o lançamento de muitos processos grep, iniciar um só:

#!/bin/sh
for i in /proc/[0-9]*/fd/*
do
    echo ${i%/fd/*} $(readlink $i)
done | grep -q /dev/snd/pcm

Isso leva agora 4.5s no meu desktop, em comparação com 7.5s quando há um processo de grep para cada arquivo aberto.

Mas ... o grep não é necessário aqui, eu acho. Se você se importa tanto, você pode tentar:

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

Este é ainda mais rápido para mim (test é quase sempre um builtin shell), mas acho que isso é mais por causa dos métodos de teste ruins. Tente você mesmo.

Outras dicas

Há uma resposta para esta pergunta sobre o ALSA FAQ . No meu sistema, usando fusor é muito mais rápido do que usar lsof.

fuser -v /dev/snd/*

Você não diz que tipo de escalas de tempo que você está procurando, mas por sua sugestão alternativa

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

pode trabalhar e dar-lhe um pouco de velocidade para cima, como forças usando cut em vez de awk.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top