/ Proc altındaki bir dosyadaki değişiklikleri bildir


13

Bash'da, tespit edilirlerse kulaklıklara geçecek ve değilse, PulseAudio ile harici bir USB hoparlöre geçecek küçük bir 'arka plan programı' yazdım.

Aradığım şey, dosyadaki değişikliklerin bildirimini almanın bir yoludur /proc/asound/card0/codec#0, tıpkı inotifywaitgerçek dosyalarda olduğu gibi (/ proc altındaki dosyaları "sözde dosyalar" olarak kabul etmek).

O çalışır, çünkü benim kod biraz deli bulmak sleep 1ile awk86400 kere bir gün bütün gün, için :)

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

Aradığım şey şudur (bu örnek işe yaramaz):

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

Bu şekilde, döngü içindeki komutlar yalnızca $codecdosyada gerçek değişiklikler olduğunda çalıştırılır .


1
Çılgınca değil - topGUI sistemi monitörleri gibi şeyler /prockısa aralıklarla çok daha fazlasını okuyor . Tabii ki, muhtemelen derlenmiş yürütülebilir dosyalar olarak çok daha verimli bir şekilde yaparlar, ancak asıl nokta: bilgi yoklaması yaygın bir görevdir.
goldilocks

2
Temel sorun sizin için benzersiz olmadığından, bazı hazır çözümlerin olmasını beklerim (en azından bazı donanımlar için) - unix.stackexchange.com/questions/25776/… ve superuser.com/questions / 339900 /… . Nihai kaynak elbette çekirdek ağacıdır (ve bazı sürücülere uygulamaya karar verirseniz donanım özellikleri).
peterph

1
Bu ortaya çıkarsa /proc, muhtemelen komut dosyanızı bir udev kuralıyla tetikleyebilirsiniz , ki bu oldukça idealdir. Daha az ideal udev kuralları ile gelmek ne kadar sıkıcı olabilir;)
goldilocks

@peterph Toplayabildiğim kadarıyla, hda-fiil parametreleri ayarlamak veya kontrol etmek için bir arayüz sağlar, ancak her saniye de çalıştırmam gerekecek gibi görünüyor.
Teresa e Junior

@goldilocks Kulaklıkları taktığınızda herhangi bir udev olayı gönderilmez. Yoksa özlediğim başka bir şey var mı?
Teresa e Junior

Yanıtlar:


10

Aradığım şey, dosyadaki değişikliklerin bildirimini almanın bir yoludur [proc]

Yapamazsınız, çünkü bunlar dosya değil. Bu oldukça yinelenen bir soru değil, ama burada cevap nedenini açıklıyor.

/procbir çekirdek arayüzüdür. Orada gerçek dosya yok, bu yüzden değişemezler. Tutamaçlardan okumak bir istektir ve okuduğunuzda dosyadaki veriler buna bir yanıttır.

Bunun gibi bir şeyi simüle etmenin tek yolu, dosyayı aralıklarla okumak ve çekirdekten gelen yanıtın değişip değişmediğini görmek için içeriği karşılaştırmaktır - bunu zaten yapmışsınız gibi görünüyor.

statDosyaları procfs ederseniz , atime ve mtime aynı olacaktır: bazı dosyalar için stat çağrısı her zaman, diğerleri için sistem önyüklemesi sırasındaki bir zamandır. İlk durumda, her zaman değişmiş gibi görünecek, ikincisinde asla değişmemiş gibi görünecek.


Ne yazık ki, her saniye sorgulamak bile önemli bir gecikme ekler (örneğin 500 ms). Bunu yapmanın daha hızlı / daha verimli bir yolu olacağını umuyordum, ancak top gibi uygulamaların aynı şekilde yapıldığından bahsettiğinizden, bu şekilde bırakacağımı düşünüyorum.
Teresa e Junior

@TeresaeJunior Gecikme bir konuysa (burada olmadığını düşünüyorum), örneğin, anketin süresi bir hesaplamada kullanıldığından, gerçek süreyi zamanlarsınız (ve sadece uyumak istediğiniz zamanı kullanmazsınız) . Bu çok gibi görünüyor; Ben bash betikleri hiç profilli değil bu yüzden burada ne normal olacağını bilmiyorum (hmm ... iyi ayrı bir soru). Awk == fork()ve bunun gibi şeyler çağırmak pahalıdır; C dilinde yazılmış tüm yardımcı programlar, belirtildiği gibi, daha hızlı yöntemlere sahip olacaktır. Hala genel olarak sisteme çok fazla yük eklediğinizi sanmıyorum tho.
goldilocks

1
Hayır, özür dilerim, demek istediğim: Kulaklıkları taktığım zamandan bir sonraki uykuya kadar belirgin bir gecikme var. Ama uyku süresini azaltmayı planlamıyorum. Yardımınız için teşekkürler!
Teresa e Junior

4

PulseAudio kullanıyorsanız, pactl subscribebunu yapın.


Evet kesinlikle! Bazı ses sorunları nedeniyle birkaç ay önce PA 4.0'ı derledikten sonra kullanmaya başladım. Debian Stable'daki sürüm 2.0'dır (yakın zamanda backport'lara 4.0 yüklediler) ve subscribe2.0'da yoktu .
Teresa e Junior

2

Ayrıca, /proc/izin verilen bazı dosyaların yoklama yoluyla yapılan değişiklikler için izlenmesine izin verildiğini , örneğin bunu man procyaparsanız /proc/self/mountsdosya hakkında aşağıdakileri okuyabileceğinizi unutmayın :

/ proc / [pid] / mounts (Linux 2.4.19'dan beri) Bu dosya, işlemin mount ad alanında geçerli olarak bağlanmış tüm dosya sistemlerini listeler (bkz. mount_namespaces (7)). Bu dosyanın biçimi fstab (5) içinde belgelenmiştir.

Çekirdek sürümü 2.6.15 olduğundan, bu dosya okunabilir: dosyayı okumak için açtıktan sonra, bu dosyadaki bir değişiklik (yani, bir dosya sistemi bağlama veya çıkarma), dosya tanımlayıcısını istisnai bir koşul olarak işaretlemek için select (2) işlevine neden olur ve anket (2) ve epoll_wait (2) dosyayı bir öncelik olayına (POLLPRI) sahip olarak işaretler. (Linux 2.6.30'dan önce, bu dosyadaki bir değişiklik dosya tanımlayıcısının select (2) için okunabilir ve anket (2) ve epoll_wait (2) için bir hata koşulu olduğu işaretlendi.

Ve aşağıdaki soruda tam olarak uygulanmakta olan şey budur:

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


-1

Değişen dosyaları netlinkizlemek için kullanmayı deneyin /proc.

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


Siteye hoş geldiniz. Lütfen bu görevi yerine getirmek için nasıl kullanılacağına dair biraz açıklama ekleyin netlink; bağladığınız harici içerikten belli değil. Ayrıca, harici içerik değişebileceği veya kaldırılabileceği için (yalnızca orijinal olarak bağlantı verilen sayfanızın üst kısmındaki bildirime bakın), bu da sizin katkınızın yararlılığını azaltacaktır.
AdminBee
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.