Trouver des processus en utilisant ALSA rapide
Question
Actuellement, la /usr/sbin/alsa
façon dans Debian connaît les processus à l'aide de la carte son qui ressemble à:
echo $( \
lsof +D /dev -F rt \
| awk '/^p/ {pid=$1} /^t/ {type=$1} /^r0x(74|e)..$/ && type == "tCHR" {print pid}' \
| cut -c 2- \
| uniq \
)
Ce qui est plutôt laid et dépend de lsof
. Je suis à la recherche d'une solution sans lsof
Posix, peut-être en utilisant / proc.
time for i in /proc/*/fd/*; do readlink $i | grep -q /dev/snd/pcm && echo $i | awk -F '/' '{print $3}'; done | uniq
semble malheureusement prendre deux fois plus longtemps que l'extrait ci-dessus basé lsof
. Pouvez-vous faire plus vite, afin d'en faire une solution de remplacement viable?
Mise à jour Je réécris ci-dessus comme:
#!/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
Mais il semble avoir les mêmes performances que mon extrait plus tôt. Je soupçonne que grep est le coupable.
Mise à jour: J'ai ouvert un bug Debian sur le sujet.
La solution
Vous commencez beaucoup de processus ici. vous pouvez plutôt essayer de faire d'une manière similaire au script lsof vous mis en ligne ... mais en remplaçant lsof par une coque pour la boucle:
Si vous voulez éviter de lancer beaucoup de processus de grep, commencer une seule:
#!/bin/sh
for i in /proc/[0-9]*/fd/*
do
echo ${i%/fd/*} $(readlink $i)
done | grep -q /dev/snd/pcm
Cela prend maintenant 4.5s sur mon bureau, par rapport à 7,5s quand il y a un processus de grep pour chaque fichier ouvert.
Mais ... votre grep n'est pas nécessaire ici, je pense. Si vous aimez beaucoup, vous pouvez essayer:
#!/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
Ceci est encore plus rapide pour moi (test
est presque toujours une commande du shell), mais je pense que cela est plus en raison de mauvaises méthodes de test. Essayez vous-même.
Autres conseils
Il y a une réponse à cette question sur le FAQ ALSA . Sur mon système, en utilisant l'unité de fusion est beaucoup plus rapide que d'utiliser lsof.
fuser -v /dev/snd/*
Vous ne dites pas quel genre de échelles de temps que vous cherchez, mais pour votre autre suggestion
for i in /proc/[0-9]*/fd/*;
peut travailler et vous donner un peu de vitesse lorsque la puissance en utilisant cut
plutôt que awk
.