Findungsprozesse mit ALSA-Sound schnell
Frage
Zur Zeit der Weg /usr/sbin/alsa
in Debian kennt die Prozesse, die die Soundkarte wie folgt aussieht:
echo $( \
lsof +D /dev -F rt \
| awk '/^p/ {pid=$1} /^t/ {type=$1} /^r0x(74|e)..$/ && type == "tCHR" {print pid}' \
| cut -c 2- \
| uniq \
)
Welche ziemlich hässlich ist und hängt von lsof
. Ich suche eine POSIX-Lösung ohne lsof
, vielleicht mit / proc.
time for i in /proc/*/fd/*; do readlink $i | grep -q /dev/snd/pcm && echo $i | awk -F '/' '{print $3}'; done | uniq
scheint leider doppelt so lang wie die lsof
Schnipsel oben basiert zu nehmen. Können Sie es schneller machen, um es eine tragfähige Ersatz zu machen?
Aktualisieren Ich schrieb die oben als:
#!/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
Aber es scheint, die gleiche Leistung wie meine früheren Schnipsel zu haben. Ich vermute, grep ist der Schuldige.
Update: Ich habe einen Debian Bug geöffnet auf das Thema.
Lösung
Sie beginnen hier viele Prozesse. Stattdessen können Sie versuchen, auf eine ähnliche Art und Weise zu dem lsof Skript tun Sie auf dem Laufenden ... aber ersetzen lsof durch eine Schale für Schleife:
Wenn Sie viele grep Prozesse vermeiden wollen starten, starten nur ein:
#!/bin/sh
for i in /proc/[0-9]*/fd/*
do
echo ${i%/fd/*} $(readlink $i)
done | grep -q /dev/snd/pcm
Das dauert jetzt 4,5s auf meinem Desktop, im Vergleich zu 7.5s, wenn für jede geöffnete Datei ein grep Prozess gibt.
Aber ... Ihr grep ist hier nicht notwendig, denke ich. Wenn Sie so viel kümmern, können Sie versuchen:
#!/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
Das ist auch für mich schneller (test
fast immer eine Schale builtin ist), aber ich denke, dies ist wegen der schlechten Testmethoden mehr ist. Versuchen Sie, sich.
Andere Tipps
Es gibt eine Antwort auf diese Frage auf der ALSA FAQ . Auf meinem System Fixierer verwendet, ist viel schneller als lsof verwendet wird.
fuser -v /dev/snd/*
Sie sagen nicht, welche Art von Zeitplan für die Sie suchen, aber für Ihren Alternativvorschlag
for i in /proc/[0-9]*/fd/*;
funktionieren könnte und geben Sie ein wenig beschleunigen, wie man mit cut
statt awk
.