Ich habe einen kleinen 'Daemon' in Bash geschrieben, der auf die Kopfhörer umschaltet, wenn sie erkannt werden, und wenn nicht, auf einen externen USB-Lautsprecher mit PulseAudio umschaltet.
Was ich suche, ist eine Möglichkeit, Benachrichtigungen über Änderungen an der Datei zu erhalten /proc/asound/card0/codec#0
, wie inotifywait
dies auch bei echten Dateien der Fall ist (Dateien unter / proc werden als "Pseudodateien" betrachtet).
Ich finde meinen Code ein bisschen verrückt, denn es läuft sleep 1
mit awk
für den ganzen Tag, die 86.400 mal pro Tag ist :)
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
Was ich suche, ist etwas wie (dieses Beispiel funktioniert nicht):
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
Auf diese Weise werden die Befehle in der Schleife nur ausgeführt, wenn die $codec
Datei tatsächlich geändert wurde .
/proc
, können Sie Ihr Skript wahrscheinlich mit einer udev- Regel auslösen , was ziemlich ideal wäre. Weniger ideal ist, wie mühsam es sein kann, mit udev-Regeln zu kommen;)
top
und GUI-Systemmonitore lesen/proc
in kurzen Intervallen viel mehr als das . Natürlich machen sie es wahrscheinlich viel effizienter als kompilierte ausführbare Dateien, aber der Punkt ist: Das Abrufen von Informationen ist eine häufige Aufgabe.