문제

현재 방법 /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.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top