2009-02-08 12 views
5

वर्तमान में जिस तरह से डेबियन में /usr/sbin/alsa साउंड कार्ड का उपयोग कर प्रक्रियाओं को जानता है का उपयोग कर प्रक्रियाओं लगता है:ढूँढना 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 पर निर्भर करता है। मैं lsof के बिना एक POSIX समाधान की तलाश में हूं, शायद/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 bug खोला है।

+0

/proc POSIX का हिस्सा नहीं है, जहां तक ​​मुझे पता है। –

+0

जब मैं पॉज़िक्स कहता हूं, मेरा मतलब है कि शेल कोड उदाहरण के लिए डैश जैसे किसी भी खोल पर चलाने में सक्षम होना चाहिए। – hendry

+0

/बिन/पॉश - मेरा मतलब है:} – hendry

उत्तर

2

आप यहां बहुत सारी प्रक्रियाएं शुरू करते हैं। इसके बजाय आप lsof स्क्रिप्ट आप पोस्ट ... करने के लिए एक समान तरीके से कर रही है, लेकिन पाश के लिए एक खोल द्वारा lsof की जगह की कोशिश कर सकते हैं:

आप ग्रेप प्रक्रियाओं के बहुत सारे शुरू करने से बचना चाहते हैं, शुरू में केवल एक:

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

7.5% की तुलना में यह मेरे डेस्कटॉप पर 4.5s लेता है, जब प्रत्येक खुली फ़ाइल के लिए एक 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 लगभग हमेशा एक खोल builtin है), लेकिन मुझे लगता है कि इस वजह से बुरा परीक्षण तरीकों में से अधिक है। अपने आप को कोशिश करो

+0

यह कोड मेरे परीक्षणों पर 3x तेज है। बहुत बहुत धन्यवाद! मैंने गलत तरीके से पैरामीटर विस्तार से परहेज किया है। – hendry

13

ALSA FAQ पर इस प्रश्न का उत्तर है। मेरे सिस्टम पर, fuser का उपयोग lsof का उपयोग करने से तेज है।

fuser -v /dev/snd/* 
+0

'fuser' तेज़ है, लेकिन यह [psmisc] (http://packages.qa.debian.org/p/psmisc.html) पर निर्भर करता है। मैं निर्भरता बहाल करने की कोशिश कर रहा हूं, दूसरे के साथ प्रतिस्थापित नहीं। :-) – hendry

+0

ALSA FAQ लिंक टूटा हुआ है। –

+0

5 साल पहले पोस्ट किया गया एफएक्यू यूआरएल एक अनधिकृत एफएक्यू से था जो दुर्भाग्य से अब अस्तित्व में नहीं है। 200 9 में यह कैसा दिखता है: https://web.archive.org/web/20090201162847/http://alsa.opensrc.org/index.php/FAQ – jfsantos

1

आप कहते हैं कि नहीं है timescales आप देख रहे हैं कि किस तरह की है, लेकिन अपने विकल्प सुझाव के लिए

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

काम करते हैं और आप गति को थोड़ा सा दे सकता है, का उपयोग कर cut पराक्रम के बजाय के रूप में awk

संबंधित मुद्दे