Быстрый поиск процессов с использованием ALSA sound

StackOverflow https://stackoverflow.com/questions/526132

Вопрос

В настоящее время способ /usr/sbin/alsa в Debian известно, что процессы, использующие звуковую карту, выглядят следующим образом:

echo $( \
    lsof +D /dev -F rt \
    | awk '/^p/ {pid=$1} /^t/ {type=$1} /^r0x(74|e)..$/ && type == "tCHR" {print pid}' \
    | cut -c 2- \
    | uniq \
)

Что довольно уродливо и зависит от lsof.Я ищу POSIX-решение без lsof, возможно, используя /proc.

    time for i in /proc/*/fd/*; do readlink $i | grep -q /dev/snd/pcm && echo $i | awk -F '/' '{print $3}'; done | uniq

К сожалению, кажется, это занимает в два раза больше времени, чем lsof основанный на приведенном выше фрагменте.Можете ли вы сделать это быстрее, чтобы сделать его жизнеспособной заменой?

Обновить Я переписал вышесказанное следующим образом:

#!/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

Но, похоже, он обладает той же производительностью, что и мой предыдущий фрагмент.Я подозреваю, что виноват grep.

Обновить:Я открыл Ошибка Debian по теме.

Это было полезно?

Решение

Здесь вы запускаете множество процессов.Вместо этого вы можете попробовать выполнить аналогично сценарию lsof, который вы опубликовали...но замена lsof на оболочку для цикла:

Если вы хотите избежать запуска множества процессов grep, запустите только один:

#!/bin/sh
for i in /proc/[0-9]*/fd/*
do
    echo ${i%/fd/*} $(readlink $i)
done | grep -q /dev/snd/pcm

Сейчас это занимает 4,5 секунды на моем рабочем столе, по сравнению с 7,5 секундами, когда для каждого открытого файла выполняется один grep-процесс.

Но...я думаю, ваш grep здесь не нужен.Если тебе так не все равно, ты можешь попробовать:

#!/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

Для меня это еще быстрее (test почти всегда является встроенной оболочкой), но я предполагаю, что это больше из-за плохих методов тестирования.Попробуй сам.

Другие советы

Ответ на этот вопрос есть на Часто ЗАДАВАЕМЫЕ ВОПРОСЫ по ALSA.В моей системе использование fuser намного быстрее, чем использование lsof.

fuser -v /dev/snd/*

Вы не говорите, какие временные рамки вы ищете, но для вашего альтернативного предложения

for i in /proc/[0-9]*/fd/*;

может сработать и немного ускорить работу, как и использование cut вместо того , чтобы awk.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top