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.

È stato utile?

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.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top