Быстрый поиск процессов с использованием ALSA sound
Вопрос
В настоящее время способ /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
.