ALSA 사운드를 사용하여 프로세스를 빠르게 찾습니다
문제
현재 방법 /usr/sbin/alsa
데비안에서는 사운드 카드를 사용하는 프로세스가 다음과 같습니다.
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이 범인이라고 생각합니다.
업데이트 : a 데비안 버그 주제에.
해결책
여기서 많은 프로세스를 시작합니다. 대신 게시 한 LSOF 스크립트와 비슷한 방식으로 수행 할 수 있지만 LSOF를 루프 용 쉘로 교체 할 수 있습니다.
많은 GREP 프로세스를 시작하지 않으려면 하나만 시작하십시오.
#!/bin/sh
for i in /proc/[0-9]*/fd/*
do
echo ${i%/fd/*} $(readlink $i)
done | grep -q /dev/snd/pcm
열린 각 파일에 대해 하나의 GREP 프로세스가있을 때 7.5 초에 비해 내 데스크탑에서 4.5 초가 소요됩니다.
그러나 ... 당신의 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
거의 항상 쉘 내장)이지만, 이것이 나쁜 테스트 방법 때문이라고 생각합니다. 스스로 시도하십시오.
다른 팁
이 질문에 대한 답이 있습니다 알사 FAQ. 내 시스템에서 퓨저를 사용하는 것이 LSOF를 사용하는 것보다 훨씬 빠릅니다.
fuser -v /dev/snd/*
당신은 당신이 찾고있는 시간 척도를 말하지 않고 당신의 대안 제안을 위해
for i in /proc/[0-9]*/fd/*;
사용할 수있는 것처럼 작동하고 약간의 속도를 줄 수 있습니다. cut
보다는 awk
.