В настоящее время способ, которым /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 по теме.