J'ai écrit un petit `` démon '' en bash qui passera aux écouteurs s'ils sont détectés, et sinon, passer à un haut-parleur USB externe avec PulseAudio.
Ce que je recherche, c'est un moyen d'obtenir une notification des modifications sur le fichier /proc/asound/card0/codec#0
, tout comme inotifywait
les vrais fichiers (en considérant les fichiers sous / proc comme des "pseudo-fichiers").
Je trouve mon code un peu fou, car il fonctionne sleep 1
avec awk
toute la journée, soit 86400 fois par jour :)
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
Ce que je recherche, c'est quelque chose comme (cet exemple ne fonctionne pas):
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
De cette façon, les commandes à l'intérieur de la boucle ne seraient exécutées que lorsqu'il y aurait de réels changements dans le $codec
fichier.
top
et les moniteurs de système GUI lisent beaucoup plus que cela/proc
à de courts intervalles. Bien sûr, ils le font probablement beaucoup plus efficacement en tant qu'exécutables compilés, mais le fait est que: rechercher des informations est une tâche courante./proc
, vous pouvez probablement déclencher votre script avec une règle udev , ce qui serait plutôt idéal. Moins idéal est à quel point il peut être fastidieux d'élaborer des règles udev;)Réponses:
Vous ne pouvez pas, car ce ne sont pas des fichiers. Ce n'est pas tout à fait une question en double, mais la réponse ici explique pourquoi.
/proc
est une interface noyau. Il n'y a pas de vrais fichiers là-bas, donc ils ne peuvent pas changer. La lecture à partir des poignées est une demande et les données du fichier lorsque vous le lisez sont une réponse à cela.La seule façon de simuler quelque chose comme ça serait de lire le fichier à intervalles et de comparer le contenu pour voir si la réponse du noyau a changé - on dirait que vous l'avez déjà fait.
Si vous
stat
procfs des fichiers, atime et mtime seront les mêmes: pour certains fichiers, c'est à chaque fois que l'appel stat a été, pour d'autres à un moment donné lors du démarrage du système. Dans le premier cas, il semblera toujours avoir changé, dans le second, il ne semblera jamais avoir changé.la source
fork()
et des trucs comme ça coûte cher; les utilitaires écrits tout en C auraient, comme mentionné, des méthodes plus rapides. Je ne pense toujours pas que vous ajoutiez beaucoup de charge au système global.Si vous utilisez PulseAudio, procédez comme
pactl subscribe
suit.la source
subscribe
sur 2.0.Gardez également à l'esprit que certains fichiers sous
/proc/
permettent d'être surveillés pour les modifications via l'interrogation, par exemple si vous le faites,man proc
vous pouvez lire ce qui suit sur le/proc/self/mounts
fichier:Et c'est exactement ce qui est mis en œuvre dans la question suivante:
/programming/5070801/monitoring-mount-point-changes-via-proc-mounts
la source
Essayez d'utiliser
netlink
pour surveiller les/proc
fichiers modifiés.https://mdlayher.com/blog/linux-netlink-and-go-part-1-netlink/
la source
netlink
pour réaliser cette tâche; cela ne ressort pas du contenu externe que vous avez lié. En outre, il est généralement préférable de ne pas avoir de réponses "lien uniquement" car le contenu externe peut changer ou être supprimé (voir l'avis en haut de votre page initialement liée, par exemple), ce qui nuirait à l'utilité de votre contribution.