Notificar alterações em um arquivo em / proc

13

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 inotifywaitocorre nos arquivos reais (considerando os arquivos em / proc como "pseudo-arquivos").

I encontrar o meu código um pouco insano, porque ele é executado sleep 1com awkpara 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 $codecarquivo.

Teresa e Junior
fonte
1
Não é uma loucura - coisas como os topmonitores do sistema GUI leem muito mais do que isso /procem 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.
GOLDILOCKS
2
Como o problema subjacente não é exclusivo para você, eu esperaria que houvesse alguma solução pronta (pelo menos para algum hardware) - dê uma olhada em unix.stackexchange.com/questions/25776/… e superuser.com/questions / 339900 /… . A fonte final é, obviamente, a árvore do kernel (e as especificações de hardware, se você decidir implementá-lo em algum driver).
Peterph
1
Se isso aparecer /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;)
Goldilocks
@peterph Pelo que pude reunir, o hda-verb fornece uma interface para definir ou verificar parâmetros, mas parece que terei que executá-lo a cada segundo também.
Teresa e Junior
@goldilocks A conexão dos fones de ouvido não envia nenhum evento udev. Ou há algo mais que estou perdendo?
Teresa e Junior

Respostas:

10

O que estou procurando é uma maneira de obter uma notificação de alterações no arquivo [in proc]

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ê statprocfs 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.

Cachinhos Dourados
fonte
Infelizmente, mesmo a pesquisa a cada segundo adiciona uma latência considerável (por exemplo, 500ms). Eu esperava que houvesse uma maneira mais rápida / eficiente de fazer isso, mas como você mencionou que aplicativos como top fazem da mesma maneira, acho que vou deixar dessa maneira.
Teresa e Junior
@TeresaeJunior Se a latência é um problema (acho que não está aqui), por exemplo, como a duração da pesquisa é usada em um cálculo, você daria o tempo real (e não apenas o tempo que pediu para dormir) . Isso parece muito; Eu nunca criei um perfil de scripts bash, então não sei o que seria normal aqui (hmm ... boa pergunta em separado). Invocar awk == 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.
GOLDILOCKS
1
Não, desculpe, eu realmente quis dizer: desde o momento em que conecto os fones de ouvido até o próximo sono, há algum atraso perceptível. Mas não pretendo diminuir o tempo de sono. Obrigado pela ajuda!
Teresa e Junior
4

Se você estiver usando o PulseAudio, pactl subscribefaça isso.

user66233
fonte
Sim, de fato! Comecei a usá-lo depois de compilar o PA 4.0 há alguns meses devido a alguns problemas de áudio. A versão no Debian Stable é 2.0 (embora eles tenham carregado 4.0 para backports recentemente), e não havia subscribeno 2.0.
Teresa e Junior
2

Lembre-se também de que alguns arquivos sob /proc/permitem o monitoramento de alterações por meio de pesquisa, por exemplo, se man procvocê pode ler o seguinte sobre o /proc/self/mountsarquivo:

/ proc / [pid] / mounts (desde Linux 2.4.19) Este arquivo lista todos os sistemas de arquivos atualmente montados no espaço para nome de montagem do processo (consulte mount_namespaces (7)). O formato deste arquivo está documentado em fstab (5).

Desde a versão 2.6.15 do kernel, este arquivo é pesquisável: após abrir o arquivo para leitura, uma alteração nesse arquivo (ou seja, uma montagem ou desmontagem do sistema de arquivos) faz com que o select (2) marque o descritor de arquivo como tendo uma condição excepcional, e poll (2) e epoll_wait (2) marcam o arquivo como tendo um evento prioritário (POLLPRI). (Antes do Linux 2.6.30, uma mudança nesse arquivo era indicada pelo descritor de arquivo como legível para select (2) e marcado como tendo uma condição de erro para poll (2) e epoll_wait (2).)

E é exatamente isso que está sendo implementado na seguinte pergunta:

/programming/5070801/monitoring-mount-point-changes-via-proc-mounts

Nelson
fonte
-1

Tente usar netlinkpara monitorar /procarquivos alterados.

https://mdlayher.com/blog/linux-netlink-and-go-part-1-netlink/

meyao
fonte
Bem vindo ao site. Por favor, adicione algumas explicações sobre como usar netlinkpara 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.
AdminBee