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.

Était-ce utile?

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.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top