Notificação de alterações em um arquivo sob / proc

11

Eu escrevi um pequeno 'daemon' no bash que mudará para os fones de ouvido se eles forem detectados, e se não, mude para um alto-falante USB externo com o PulseAudio.

O que estou procurando é uma maneira de obter notificações de alterações no arquivo /proc/asound/card0/codec#0 , assim como inotifywait em arquivos reais (considerando arquivos em / proc como "pseudo-arquivos"). / p>

Acho meu código um pouco insano, porque ele executa sleep 1 com awk para o dia inteiro, ou seja, 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 somente quando houver alterações reais no arquivo $codec .

    
por Teresa e Junior 14.09.2013 / 14:36

3 respostas

10

What I'm looking for is some way to get notification of changes on the file [in proc]

Você não pode, porque eles não são arquivos. Esta não é uma questão bem duplicada, mas a resposta aqui explica 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ê lê são uma resposta para 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, o atime e o mtime serão os mesmos: para alguns arquivos, é sempre que a chamada de stat foi, para outros, um tempo de durante a inicialização do sistema. No primeiro caso, parece que sempre mudou, no segundo, parece que nunca mudou.

    
por 14.09.2013 / 14:48
4

Se você estiver usando o PulseAudio, pactl subscribe fará isso.

    
por 26.04.2014 / 16:02
2

Lembre-se também de que alguns arquivos em /proc/ permitem que sejam monitorados para mudanças via polling, por exemplo, se você man proc você pode ler o seguinte sobre /proc/self/mounts file:

/proc/[pid]/mounts (since Linux 2.4.19) This file lists all the filesystems currently mounted in the process's mount namespace (see mount_namespaces(7)). The format of this file is documented in fstab(5).

Since kernel version 2.6.15, this file is pollable: after opening the file for reading, a change in this file (i.e., a filesystem mount or unmount) causes select(2) to mark the file descriptor as having an exceptional condition, and poll(2) and epoll_wait(2) mark the file as having a priority event (POLLPRI). (Before Linux 2.6.30, a change in this file was indicated by the file descriptor being marked as readable for select(2), and being marked as having an error condition for poll(2) and epoll_wait(2).)

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

link

    
por 04.09.2017 / 08:22

Tags