Trovare i processi che utilizzano ALSA suono veloce
Domanda
Al momento il modo /usr/sbin/alsa
in Debian conosce i processi che utilizzano la scheda audio si presenta come:
echo $( \
lsof +D /dev -F rt \
| awk '/^p/ {pid=$1} /^t/ {type=$1} /^r0x(74|e)..$/ && type == "tCHR" {print pid}' \
| cut -c 2- \
| uniq \
)
Il che è piuttosto brutto e dipende lsof
. Sto cercando una soluzione POSIX senza lsof
, magari utilizzando / proc.
time for i in /proc/*/fd/*; do readlink $i | grep -q /dev/snd/pcm && echo $i | awk -F '/' '{print $3}'; done | uniq
sembra Purtroppo a prendere il doppio del tempo come il lsof
basa frammento di sopra. Puoi renderlo più veloce, in modo da renderlo un sostituto valido?
Aggiorna 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. Ho il sospetto che grep è il colpevole.
Aggiornamento: Ho aperto un Debian bug su l'argomento.
Soluzione
Si avvia un sacco di processi qui. 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
Questa operazione richiede ora 4.5s sul mio desktop, rispetto a 7.5s quando c'è un processo di grep per ogni file aperto.
Ma ... il tuo grep non è necessario qui, credo. 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. Provate voi stessi.
Altri suggerimenti
C'è una risposta per questa domanda sul FAQ di ALSA . Sul mio sistema, utilizzando fusore è il modo più veloce rispetto all'utilizzo lsof.
fuser -v /dev/snd/*
Non si dice che tipo di tempi che stai 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
.