2009-02-08 7 views
5

Attualmente il modo /usr/sbin/alsa in Debian conosce i processi che utilizzano la scheda audio si presenta come:Trovare processi che utilizzano ALSA suono veloce

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

che è piuttosto brutto e dipende lsof. Sto cercando una soluzione POSIX senza lsof, forse usando/proc.

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

purtroppo sembra prendere il doppio del tempo come il frammento di base lsof sopra. Puoi renderlo più veloce, al fine di renderlo un sostituto valido?

Aggiornamento ho riscritto quanto sopra come:

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

Ma sembra avere le stesse prestazioni di mio precedente snippet. Sospetto che Grep sia il colpevole.

Aggiornamento: ho aperto un Debian bug sull'argomento.

+0

/proc non fa parte di POSIX, per quanto ne so. –

+0

Quando dico POSIX, voglio dire che il codice della shell dovrebbe essere in grado di funzionare su qualsiasi shell come dash per esempio. – hendry

+0

/bin/posh: è ciò che intendevo:} – hendry

risposta

2

Qui si avvia un sacco di processi. Invece si può provare a fare in modo simile allo script lsof che hai postato ... ma sostituendo lsof da un guscio per il ciclo:

Se si vuole evitare il lancio di un sacco di processi grep, avviare una sola:

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

Questo richiede 4.5 secondi sul mio desktop, rispetto ai 7.5 quando c'è un processo di grep per ogni file aperto.

Ma ... il tuo grep non è necessario qui, penso. Se ci tieni così tanto, si può provare:

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

Questo è ancora più veloce per me (test è quasi sempre un builtin di shell), ma credo che questo è più a causa dei metodi di prova cattivi. Mettiti alla prova

+0

Questo codice è 3 volte più veloce nei miei test. Ottimo grazie! Ho erroneamente evitato l'espansione dei parametri. – hendry

13

C'è una risposta per questa domanda sullo ALSA FAQ. Sul mio sistema, l'utilizzo del fuser è molto più rapido rispetto all'utilizzo di lsof.

fuser -v /dev/snd/* 
+0

'fuser' è veloce, ma dipende da [psmisc] (http://packages.qa.debian.org/p/psmisc.html). Sto cercando di gettare le dipendenze, non sostituirle con un altro. :-) – hendry

+0

Link FAQ ALSA è rotto. –

+0

L'URL delle FAQ che ho postato 5 anni fa proveniva da una FAQ non ufficiale che purtroppo non esiste più. Ecco come appariva nel 2009: https://web.archive.org/web/20090201162847/http://alsa.opensrc.org/index.php/FAQ – jfsantos

1

Tu non dici che tipo di tempi che state cercando, ma per il suggerimento alternativo

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

potrebbe funzionare e dare un po 'di velocità in su, come potrebbe utilizzare cut piuttosto che awk.

Problemi correlati