procesos que utilizan sonido ALSA rápida de los fallos
Pregunta
En la actualidad la forma /usr/sbin/alsa
en Debian conoce los procesos que utilizan la tarjeta de sonido que parece:
echo $( \
lsof +D /dev -F rt \
| awk '/^p/ {pid=$1} /^t/ {type=$1} /^r0x(74|e)..$/ && type == "tCHR" {print pid}' \
| cut -c 2- \
| uniq \
)
Lo cual es bastante feo y depende de lsof
. Busco a una solución POSIX sin lsof
, tal vez utilizando / proc.
time for i in /proc/*/fd/*; do readlink $i | grep -q /dev/snd/pcm && echo $i | awk -F '/' '{print $3}'; done | uniq
Por desgracia parece tener doble de largo que el fragmento lsof
basa anteriormente. Se puede hacer que sea más rápido, con el fin de que sea un reemplazo viable?
Actualizar Reescribí lo anterior 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
Sin embargo, parece tener el mismo rendimiento que mi fragmento anterior. Sospecho grep es el culpable.
Actualización: Me han abierto una fallos de Debian en el tema.
Solución
Se comienza una gran cantidad de procesos aquí. En su lugar, puede intentar hacer de una manera similar a la secuencia de comandos lsof informados ... pero sustituyendo lsof por una cáscara de bucle:
Si se quiere evitar el lanzamiento de una gran cantidad de procesos grep, iniciar una sola:
#!/bin/sh
for i in /proc/[0-9]*/fd/*
do
echo ${i%/fd/*} $(readlink $i)
done | grep -q /dev/snd/pcm
Esto toma ahora 4.5s en mi escritorio, en comparación con 7.5s cuando hay un proceso de grep para cada archivo abierto.
Pero ... su grep no es necesario en este caso, creo. Si te importa tanto, puede intentar:
#!/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
Esto es incluso más rápido para mí (test
es casi siempre una orden interna del shell), pero supongo que esto es más debido a los malos métodos de prueba. Pruebe usted mismo.
Otros consejos
Hay una respuesta para esta pregunta en el ALSA FAQ . En mi sistema, utilizando fusor es mucho más rápido que utilizando lsof.
fuser -v /dev/snd/*
Usted no dice qué tipo de escalas de tiempo que usted está buscando, pero por su sugerencia alternativa
for i in /proc/[0-9]*/fd/*;
podría funcionar y darle un poco de velocidad, como se podría utilizar en lugar de cut
awk
.