2009-02-08 13 views
5

Actualmente la forma /usr/sbin/alsa en Debian conoce los procesos que utilizan la tarjeta de sonido se parece a:Encontrar procesos que utilizan ALSA sonido rápido

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

que es bastante feo y depende de lsof. Estoy buscando una solución POSIX sin lsof, quizás usando/proc.

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

Desafortunadamente parece tener doble de largo que el fragmento basado lsof anteriormente. ¿Puedes hacerlo más rápido para que sea un reemplazo viable?

actualización me volvió a escribir 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 

Pero parece tener el mismo rendimiento que mi fragmento anterior. Sospecho que grep es el culpable.

Actualización: He abierto un Debian bug sobre el tema.

+0

/proc no es parte de POSIX, hasta donde yo sé. –

+0

Cuando digo POSIX, me refiero a que el código de shell debería poder ejecutarse en cualquier capa como por ejemplo un guión. – hendry

+0

/bin/posh - es lo que quise decir:} – hendry

Respuesta

2

Comienza muchos 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, inicie 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 grep para cada archivo abierto.

Pero ... su grep no es necesario aquí, 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 creo que esto es más debido a los malos métodos de prueba. Pruébalo.

+0

Ese código es 3 veces más rápido en mis pruebas. ¡Muchas gracias! He evitado erróneamente la expansión de parámetros. – hendry

13

Hay una respuesta para esta pregunta en el ALSA FAQ. En mi sistema, usar fuser es mucho más rápido que usar lsof.

fuser -v /dev/snd/* 
+0

'fuser' es rápido, pero depende de [psmisc] (http://packages.qa.debian.org/p/psmisc.html). Estoy tratando de eliminar dependencias, no reemplazarlas por otras. :-) – hendry

+0

El enlace de ALSA Preguntas frecuentes se ha roto. –

+0

La URL de las preguntas frecuentes que publiqué hace 5 años pertenecía a una pregunta frecuente no oficial que, lamentablemente, ya no existe. Así es como se veía en 2009: https://web.archive.org/web/20090201162847/http://alsa.opensrc.org/index.php/FAQ – jfsantos

1

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 cutawk.

Cuestiones relacionadas