Eu escrevi um pequeno 'daemon' no bash que mudará para os fones de ouvido se forem detectados e, caso contrário, mudará para um alto-falante USB externo com o PulseAudio.
O que estou procurando é uma maneira de obter uma notificação de alterações no arquivo /proc/asound/card0/codec#0
, assim como inotifywait
ocorre nos arquivos reais (considerando os arquivos em / proc como "pseudo-arquivos").
I encontrar o meu código um pouco insano, porque ele é executado sleep 1
com awk
para todo o dia, que é 86400 vezes por dia :)
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
O que estou procurando é algo como (este exemplo não funciona):
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
Dessa forma, os comandos dentro do loop seriam executados apenas quando houver alterações reais no $codec
arquivo.
top
monitores do sistema GUI leem muito mais do que isso/proc
em intervalos curtos. Obviamente, eles provavelmente o fazem com muito mais eficiência como executáveis compilados, mas o ponto é: pesquisar informações é uma tarefa comum./proc
, provavelmente você pode acionar seu script com uma regra do udev , o que seria bastante ideal. Menos ideal é como tedioso pode ser chegando com as regras do udev;)Respostas:
Você não pode, porque eles não são arquivos. Esta não é uma pergunta duplicada, mas a resposta aqui explica o porquê.
/proc
é uma interface do kernel. Não há arquivos reais lá, portanto eles não podem mudar. A leitura das alças é uma solicitação e os dados no arquivo quando você os lê são uma resposta a isso.A única maneira de simular algo assim seria ler o arquivo em intervalos e comparar o conteúdo para ver se a resposta do kernel mudou - parece que você já fez isso.
Se você
stat
procfs arquivos, o atime e o mtime serão os mesmos: para alguns arquivos é sempre que a chamada stat foi, para outros um tempo durante a inicialização do sistema. No primeiro caso, sempre parecerá ter mudado; no segundo, nunca parecerá ter mudado.fonte
fork()
e coisas assim são caras; todos os utilitários escritos em C teriam, como mencionado, métodos mais rápidos. Ainda acho que você não está adicionando muita carga ao sistema, em geral.Se você estiver usando o PulseAudio,
pactl subscribe
faça isso.fonte
subscribe
no 2.0.Lembre-se também de que alguns arquivos sob
/proc/
permitem o monitoramento de alterações por meio de pesquisa, por exemplo, seman proc
você pode ler o seguinte sobre o/proc/self/mounts
arquivo:E é exatamente isso que está sendo implementado na seguinte pergunta:
/programming/5070801/monitoring-mount-point-changes-via-proc-mounts
fonte
Tente usar
netlink
para monitorar/proc
arquivos alterados.https://mdlayher.com/blog/linux-netlink-and-go-part-1-netlink/
fonte
netlink
para realizar essa tarefa; não é aparente no conteúdo externo que você vinculou. Além disso, geralmente é preferível não ter respostas "somente para links", pois o conteúdo externo pode mudar ou ser removido (consulte o aviso na parte superior da sua página vinculada, por exemplo), o que diminuiria a utilidade da sua contribuição.