Encontrar processos usando ALSA rápido som
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.
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
.