2009-02-08 24 views
5

Hiện nay cách /usr/sbin/alsa trong Debian biết các quá trình sử dụng card âm thanh trông giống như:Tìm các quá trình sử dụng ALSA âm thanh nhanh

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

Đó là khá xấu xí và phụ thuộc vào lsof. Tôi đang tìm một giải pháp POSIX mà không cần lsof, có lẽ sử dụng/proc.

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

Thật không may có vẻ mất gấp đôi khi đoạn mã dựa trên lsof ở trên. Bạn có thể làm cho nó nhanh hơn, để làm cho nó trở thành một sự thay thế khả thi?

Cập nhật Tôi viết lại trên như:

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

Nhưng nó dường như có hiệu năng giống như đoạn trước đây của tôi. Tôi nghi ngờ grep là thủ phạm.

Cập nhật: Tôi đã mở một Debian bug về chủ đề.

+0

/proc không thuộc POSIX, theo như tôi biết. –

+0

Khi tôi nói POSIX, tôi có nghĩa là mã shell sẽ có thể chạy trên bất kỳ trình bao như dấu gạch ngang ví dụ. – hendry

+0

/bin/posh - là ý của tôi:} – hendry

Trả lời

2

Bạn bắt đầu rất nhiều quy trình tại đây. Thay vào đó bạn có thể thử làm theo một cách tương tự như kịch bản lsof bạn được đăng ... nhưng thay lsof bởi một lớp vỏ cho vòng lặp:

Nếu bạn muốn tránh tung ra rất nhiều các quá trình grep, bắt đầu chỉ có một:

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

Điều này sẽ mất 4,5 giây trên máy tính để bàn của tôi, so với 7,5 khi có một quy trình grep cho mỗi tệp được mở.

Nhưng ... grep của bạn không cần thiết ở đây, tôi nghĩ vậy. Nếu bạn quan tâm rất nhiều, bạn có thể thử:

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

này thậm chí còn nhanh hơn đối với tôi (test là gần như luôn luôn là một BUILTIN vỏ), nhưng tôi đoán đây là hơn vì các phương pháp thử nghiệm xấu. Hãy thử bản thân.

+0

Mã đó nhanh hơn gấp 3 lần trong các thử nghiệm của tôi. Tuyệt vời cảm ơn bạn! Tôi đã tránh nhầm lẫn mở rộng tham số. – hendry

13

Có câu trả lời cho câu hỏi này trên ALSA FAQ. Trên hệ thống của tôi, sử dụng fuser là cách nhanh hơn so với sử dụng lsof.

fuser -v /dev/snd/* 
+0

'fuser' rất nhanh, nhưng nó phụ thuộc vào [psmisc] (http://packages.qa.debian.org/p/psmisc.html). Tôi đang cố gắng để phụ thuộc, không thay thế bằng người khác. :-) – hendry

+0

Liên kết FAQ của ALSA bị hỏng. –

+0

URL FAQ tôi đã đăng 5 năm trước là từ một Câu hỏi thường gặp không chính thức mà tiếc là không tồn tại nữa. Đây là hình thức của nó trong năm 2009: https://web.archive.org/web/20090201162847/http://alsa.opensrc.org/index.php/FAQ – jfsantos

1

Bạn không nói những loại khoảng thời gian bạn đang tìm kiếm nhưng đối với đề nghị thay thế của bạn

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

có thể làm việc và cung cấp cho bạn một chút tốc độ lên, như sức mạnh sử dụng cut hơn awk.

Các vấn đề liên quan