Napisałem małego „demona” w skrócie, który przełączy się na słuchawki, jeśli zostaną wykryte, a jeśli nie, przełącz się na zewnętrzny głośnik USB z PulseAudio.
To, czego szukam, to sposób na otrzymywanie powiadomień o zmianach w pliku /proc/asound/card0/codec#0
, podobnie jak inotifywait
w przypadku plików rzeczywistych (uznanie plików w / proc za „pseudoplik”).
Mój kod jest nieco szalony, ponieważ działa sleep 1
z nim awk
przez cały dzień, czyli 86400 razy dziennie :)
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
Szukam czegoś takiego (ten przykład nie działa):
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
W ten sposób polecenia wewnątrz pętli byłyby uruchamiane tylko wtedy, gdy w $codec
pliku występują rzeczywiste zmiany .
/proc
, prawdopodobnie możesz uruchomić skrypt za pomocą reguły udev , co byłoby całkiem idealne. Mniej idealne jest to, jak żmudne może być wymyślanie reguł udev;)
top
i monitory systemu GUI czytają o wiele więcej niż/proc
w krótkich odstępach czasu. Oczywiście prawdopodobnie robią to znacznie wydajniej jako skompilowane pliki wykonywalne, ale chodzi o to, że sondowanie informacji jest powszechnym zadaniem.