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.

War es hilfreich?

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.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top