ฉันเขียน 'daemon' ขนาดเล็กใน bash ที่จะเปลี่ยนเป็นหูฟังหากตรวจพบและหากไม่ได้เปลี่ยนเป็นลำโพง USB ภายนอกด้วย PulseAudio
สิ่งที่ฉันกำลังมองหาคือวิธีการรับการแจ้งเตือนการเปลี่ยนแปลงในไฟล์/proc/asound/card0/codec#0
เช่นเดียวinotifywait
กับในไฟล์จริง (พิจารณาไฟล์ภายใต้ / proc เป็น "pseudo-files")
ฉันพบรหัสของฉันบิตบ้าเพราะมันทำงานsleep 1
กับawk
ทั้งวันนั่นคือ 86400 ครั้งต่อวัน :)
while sleep 1; do
_1=${_2:-}
_2=$(awk '/Pin-ctls/{n++;if(n==4)print}' '/proc/asound/card0/codec#0')
[[ ${_1:-} = $_2 ]] ||
if [[ $_2 =~ OUT ]]; then
use_speakers
else
use_internal
fi
done
สิ่งที่ฉันกำลังมองหาคือสิ่งที่ต้องการ (ตัวอย่างนี้ไม่ทำงาน):
codec=/proc/asound/card0/codec#0
while inotifywait $codec; do
if [[ $(awk '/Pin-ctls/{n++;if(n==4)print}' $codec) =~ OUT ]]; then
use_speakers
else
use_internal
fi
done
วิธีนี้คำสั่งภายในลูปจะทำงานเฉพาะเมื่อมีการเปลี่ยนแปลงจริงใน$codec
ไฟล์
/proc
คุณอาจเรียกสคริปต์ของคุณด้วยกฎudevซึ่งน่าจะเหมาะอย่างยิ่ง น้อยเหมาะเป็นวิธีการที่น่าเบื่อที่จะสามารถขึ้นมาพร้อมกับกฎ udev;)
top
และจอภาพระบบ GUI อ่านมากกว่าทั้งหมดจาก/proc
ช่วงเวลาสั้น ๆ แน่นอนว่าพวกเขาอาจทำมันได้อย่างมีประสิทธิภาพมากขึ้นเช่นเดียวกับไฟล์ประมวลผลที่คอมไพล์ แต่ประเด็นคือ: การสำรวจข้อมูลเป็นงานทั่วไป