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 .
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./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;)Antworten:
Sie können nicht, weil sie keine Dateien sind. Dies ist keine doppelte Frage, aber die Antwort hier erklärt, warum.
/proc
ist eine Kernel-Schnittstelle. Es gibt dort keine echten Dateien, daher können sie sich nicht ändern. Das Lesen aus den Handles ist eine Anforderung, und die Daten in der Datei, wenn Sie sie lesen, sind eine Antwort darauf.Die einzige Möglichkeit, so etwas zu simulieren, besteht darin, die Datei in regelmäßigen Abständen zu lesen und den Inhalt zu vergleichen, um festzustellen, ob sich die Antwort des Kernels geändert hat.
Wenn Sie
stat
Dateien verarbeiten, stimmen atime und mtime überein: Bei einigen Dateien handelt es sich um den Zeitpunkt des stat-Aufrufs, bei anderen um einen Zeitraum ab dem Systemstart. Im ersten Fall wird es immer anders zu sein scheinen, im zweiten Fall wird es nie anders zu sein scheinen.quelle
fork()
und solche Sachen sind teuer; Dienstprogramme, die alle in C geschrieben wurden, hätten, wie erwähnt, schnellere Methoden. Ich glaube immer noch nicht, dass Sie dem System insgesamt viel Last hinzufügen.Wenn Sie PulseAudio verwenden,
pactl subscribe
geschieht dies.quelle
subscribe
auf 2.0.Bedenken Sie auch, dass einige Dateien
/proc/
, für die eine Überwachung auf Änderungen per Abruf zulässig ist, z. B. wenn Sie dies tunman proc
, Folgendes über/proc/self/mounts
Dateien lesen können :Und genau das wird in der folgenden Frage umgesetzt:
/programming/5070801/monitoring-mount-point-changes-via-proc-mounts
quelle