Я написав невеликий "демон" в баші, який перейде на навушники, якщо вони виявлені, а якщо ні, перемкніть на зовнішній динамік USB за допомогою PulseAudio.
Що я шукаю - це певний спосіб отримувати сповіщення про зміни у файлі /proc/asound/card0/codec#0
, як inotifywait
і у реальних файлах (розглядаючи файли під / proc як "псевдофайли").
Я знаходжу мій код трохи божевільні, тому що він працює 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
коротких інтервалів. Звичайно, вони, ймовірно, роблять це набагато ефективніше, як складені виконавчі файли, але справа в тому, що: опитування інформації є загальним завданням.