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 inotifywait
w przypadku plików rzeczywistych (uznanie plików w / proc za „pseudoplik”).
Mój kod jest nieco szalony, ponieważ działa sleep 1
z nim awk
przez 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 $codec
pliku występują rzeczywiste zmiany .
top
i monitory systemu GUI czytają o wiele więcej niż/proc
w 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./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;)Odpowiedzi:
Nie możesz, bo to nie są pliki. To nie jest dość zduplikowane pytanie, ale odpowiedź tutaj wyjaśnia, dlaczego.
/proc
jest 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
stat
procfsujesz 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.źródło
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.Jeśli używasz PulseAudio, zrób
pactl subscribe
to.źródło
subscribe
na 2.0 nie było .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żeszman proc
, możesz przeczytać o/proc/self/mounts
pliku:I właśnie to jest realizowane w następującym pytaniu:
/programming/5070801/monitoring-mount-point-changes-via-proc-mounts
źródło
Spróbuj użyć
netlink
do monitorowania/proc
zmienionych plików.https://mdlayher.com/blog/linux-netlink-and-go-part-1-netlink/
źródło
netlink
tego 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.