Powiadamiaj o zmianach w pliku w / proc


13

Napisałem małego „demona” w skrócie, który przełączy się na słuchawki, jeśli zostaną wykryte, a jeśli nie, przełącz się na zewnętrzny głośnik USB z PulseAudio.

To, czego szukam, to sposób na otrzymywanie powiadomień o zmianach w pliku /proc/asound/card0/codec#0, podobnie jak inotifywaitw przypadku plików rzeczywistych (uznanie plików w / proc za „pseudoplik”).

Mój kod jest nieco szalony, ponieważ działa sleep 1z nim awkprzez cały dzień, czyli 86400 razy dziennie :)

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

Szukam czegoś takiego (ten przykład nie działa):

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

W ten sposób polecenia wewnątrz pętli byłyby uruchamiane tylko wtedy, gdy w $codecpliku występują rzeczywiste zmiany .


1
To nie jest szalone - takie rzeczy jak topi monitory systemu GUI czytają o wiele więcej niż /procw krótkich odstępach czasu. Oczywiście prawdopodobnie robią to znacznie wydajniej jako skompilowane pliki wykonywalne, ale chodzi o to, że sondowanie informacji jest powszechnym zadaniem.
goldilocks

2
Ponieważ podstawowy problem nie jest unikalny dla ciebie, oczekiwałbym, że będzie gotowe rozwiązanie (przynajmniej dla niektórych urządzeń) - spójrz na unix.stackexchange.com/questions/25776/... i superuser.com/questions / 339900 /… . Ostatecznym źródłem jest oczywiście drzewo jądra (i specyfikacje sprzętowe, jeśli zdecydujesz się je zaimplementować w jakimś sterowniku).
peterph

1
Jeśli to się pojawi /proc, prawdopodobnie możesz uruchomić skrypt za pomocą reguły udev , co byłoby całkiem idealne. Mniej idealne jest to, jak żmudne może być wymyślanie reguł udev;)
goldilocks 14.09.2013

@peterph Z tego, co mogłem zebrać, hda-czasownik zapewnia interfejs do ustawiania lub sprawdzania parametrów, ale wygląda na to, że będę musiał go uruchamiać co sekundę.
Teresa e Junior

@goldilocks Podłączenie słuchawek nie wysyła żadnego zdarzenia udev. A może brakuje mi czegoś więcej?
Teresa e Junior

Odpowiedzi:


10

To, czego szukam, to sposób na powiadomienie o zmianach w pliku [w proc]

Nie możesz, bo to nie są pliki. To nie jest dość zduplikowane pytanie, ale odpowiedź tutaj wyjaśnia, dlaczego.

/procjest interfejsem jądra. Nie ma tam prawdziwych plików, dlatego nie można ich zmienić. Odczytywanie z uchwytów jest żądaniem, a dane w pliku, gdy je czytasz, są odpowiedzią na to.

Jedynym sposobem na symulację czegoś takiego jest odczytywanie pliku w odstępach czasu i porównywanie zawartości, aby sprawdzić, czy odpowiedź z jądra uległa zmianie - wygląda na to, że już to zrobiłeś.

Jeśli statprocfsujesz pliki, atime i mtime będą takie same: dla niektórych plików dzieje się to za każdym razem, gdy było wywołanie stat, dla innych czas od uruchomienia systemu. W pierwszym przypadku zawsze będzie się wydawało, że się zmieniło, w drugim przypadku nigdy się nie zmieni.


Niestety, nawet odpytywanie go co sekundę powoduje znaczne opóźnienie (np. 500 ms). Miałem nadzieję, że będzie szybszy / bardziej wydajny sposób na zrobienie tego, ale ponieważ wspomniałeś, że aplikacje takie jak top robią to w ten sam sposób, myślę, że tak to zostawię.
Teresa e Junior

@TeresaeJunior Jeśli opóźnienie jest problemem (myślę, że go tu nie ma), np. Ponieważ czas trwania ankiety jest wykorzystywany w obliczeniach, należy określić czas rzeczywistego czasu trwania (a nie tylko wykorzystać czas, o który prosiłeś) . To jednak wydaje się dużo; Nigdy nie profilowałem skryptów bashowych, więc nie wiem, co byłoby tutaj normalne (hmm ... dobre osobne pytanie). Wywołanie awk == fork()i tego typu rzeczy jest kosztowne; narzędzia napisane w całości w C miałyby, jak wspomniano, szybsze metody. Nadal nie sądzę, że ogólnie dodajesz wiele do systemu.
goldilocks

1
Nie, przepraszam, miałem na myśli: od momentu podłączenia słuchawek do następnego snu zauważalne jest opóźnienie. Ale nie planuję skracać czasu snu. Dzięki za pomoc!
Teresa e Junior

4

Jeśli używasz PulseAudio, zrób pactl subscribeto.


W rzeczy samej! Zacząłem go używać po kompilacji PA 4.0 kilka miesięcy temu z powodu problemów z dźwiękiem. Wersja na Debian Stable to 2.0 (chociaż ostatnio przesłali 4.0 do backportów), a subscribena 2.0 nie było .
Teresa e Junior

2

Należy również pamiętać, że niektóre pliki objęte /proc/zezwoleniem mogą być monitorowane pod kątem zmian za pomocą odpytywania, na przykład jeśli możesz man proc, możesz przeczytać o /proc/self/mountspliku:

/ proc / [pid] / mounts (od Linuksa 2.4.19) Ten plik zawiera listę wszystkich systemów plików aktualnie zamontowanych w przestrzeni nazw montowania procesu (patrz mount_namespaces (7)). Format tego pliku jest udokumentowany w fstab (5).

Od wersji 2.6.15 jądra plik ten jest pollable: po otwarciu pliku do odczytu zmiana w tym pliku (tj. Podłączenie lub odmontowanie systemu plików) powoduje, że select (2) zaznacza deskryptor pliku jako wyjątkowy warunek, oraz poll (2) i epoll_wait (2) oznaczają plik jako mający zdarzenie priorytetowe (POLLPRI). (Przed Linuksem 2.6.30 zmiana w tym pliku była wskazywana przez deskryptor pliku oznaczony jako czytelny dla select (2) i oznaczony jako posiadający warunek błędu dla poll (2) i epoll_wait (2).)

I właśnie to jest realizowane w następującym pytaniu:

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


-1

Spróbuj użyć netlinkdo monitorowania /proczmienionych plików.

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


Witamy na stronie. Dodaj wyjaśnienie, w jaki sposób użyć netlinktego zadania; nie wynika to z treści zewnętrznych, które łączysz. Ponadto generalnie preferuje się brak odpowiedzi typu „tylko link”, ponieważ zawartość zewnętrzna może ulec zmianie lub zostać usunięta (patrz np. Uwaga na pierwszej stronie, do której prowadzi link), co osłabiłoby użyteczność twojego wkładu.
AdminBee
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.