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.

¿Fue útil?

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.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top