Beritahu tentang perubahan pada file di bawah / proc

13

Saya telah menulis 'daemon' kecil di bash yang akan beralih ke headphone jika terdeteksi, dan jika tidak, beralih ke speaker USB eksternal dengan PulseAudio.

Apa yang saya cari adalah beberapa cara untuk mendapatkan pemberitahuan tentang perubahan pada file /proc/asound/card0/codec#0, seperti inotifywaithalnya pada file nyata (mempertimbangkan file di bawah / proc sebagai "file semu").

Saya menemukan kode saya sedikit gila, karena berjalan sleep 1dengan awkuntuk sepanjang hari, yaitu 86.400 kali sehari :)

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

Apa yang saya cari adalah sesuatu seperti (contoh ini tidak berfungsi):

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

Dengan cara ini perintah-perintah di dalam loop akan dijalankan hanya ketika ada perubahan nyata pada $codecfile.

Teresa e Junior
sumber
1
Ini tidak gila - hal-hal seperti topdan monitor sistem GUI banyak membaca lebih dari itu dari /procpada interval pendek. Tentu saja, mereka mungkin melakukannya jauh lebih efisien sebagai executable yang dikompilasi, tetapi intinya adalah: mencari informasi adalah tugas bersama.
goldilocks
2
Karena masalah yang mendasarinya tidak unik untuk Anda, saya berharap akan ada beberapa solusi siap pakai (setidaknya untuk beberapa perangkat keras) - lihat di unix.stackexchange.com/questions/25776/… dan superuser.com/questions / 339.900 / ... . Sumber utama tentu saja pohon kernel (dan spesifikasi perangkat keras jika Anda memutuskan untuk mengimplementasikannya ke beberapa driver).
peterph
1
Jika ini muncul /proc, Anda mungkin dapat memicu skrip Anda dengan aturan udev , yang akan sangat ideal. Yang kurang ideal adalah betapa membosankannya membuat aturan udev;)
goldilocks
@peterph Dari apa yang bisa saya kumpulkan, hda-kata kerja menyediakan antarmuka untuk pengaturan atau memeriksa parameter, tetapi sepertinya saya harus menjalankannya setiap detik juga.
Teresa e Junior
@goldilocks Memasukkan headphone tidak mengirim udev-event apa pun. Atau ada lagi yang hilang?
Teresa e Junior

Jawaban:

10

Apa yang saya cari adalah beberapa cara untuk mendapatkan pemberitahuan tentang perubahan pada file [dalam proc]

Anda tidak bisa, karena mereka bukan file. Ini bukan pertanyaan duplikat, tetapi jawabannya di sini menjelaskan alasannya.

/procadalah antarmuka kernel. Tidak ada file nyata di sana, maka mereka tidak dapat berubah. Membaca dari pegangan adalah permintaan dan data dalam file ketika Anda membacanya adalah balasan untuk itu.

Satu-satunya cara Anda dapat mensimulasikan sesuatu seperti ini adalah dengan membaca file secara berkala dan membandingkan konten untuk melihat apakah balasan dari kernel telah berubah - sepertinya Anda sudah melakukannya.

Jika Anda statmenghasilkan file, atime dan mtime akan sama: untuk beberapa file itu setiap kali panggilan stat, untuk yang lain waktu dari saat boot sistem. Dalam kasus pertama, sepertinya akan selalu berubah, di kedua, sepertinya tidak akan pernah berubah.

goldilocks
sumber
Sayangnya, bahkan polling setiap detiknya menambah latensi yang cukup besar (mis. 500 ms). Saya berharap akan ada cara yang lebih cepat / lebih efisien untuk melakukan ini, tetapi karena Anda telah menyebutkan bahwa aplikasi seperti top melakukannya dengan cara yang sama, saya pikir saya akan membiarkannya begitu.
Teresa e Junior
@TeresaeJunior Jika latensi adalah masalah (saya pikir itu tidak ada di sini), misalnya, karena durasi jajak pendapat digunakan dalam perhitungan, Anda akan menentukan waktu durasi aktual (dan tidak hanya menggunakan waktu yang Anda minta untuk tidur) . Itu sepertinya banyak; Saya tidak pernah membuat profil skrip bash jadi saya tidak tahu apa yang normal di sini (hmm ... pertanyaan terpisah yang bagus). Meminta awk == fork()dan hal-hal seperti itu mahal; utilitas yang ditulis dalam bahasa C akan, seperti yang disebutkan, memiliki metode yang lebih cepat. Saya masih tidak berpikir Anda menambahkan banyak beban ke sistem keseluruhan tho.
goldilocks
1
Tidak, maaf, maksud saya sebenarnya: dari saat saya mencolokkan headphone sampai tidur berikutnya ada beberapa penundaan yang nyata. Tapi saya tidak berencana mengurangi waktu tidur. Terima kasih atas bantuan Anda!
Teresa e Junior
4

Jika Anda menggunakan PulseAudio, pactl subscribelakukan ini.

pengguna66233
sumber
Ya memang! Saya mulai menggunakannya setelah mengkompilasi PA 4.0 beberapa bulan yang lalu karena beberapa masalah audio. Versi pada Debian Stable adalah 2.0 (meskipun mereka telah mengunggah 4.0 ke backports baru-baru ini), dan tidak ada subscribepada 2.0.
Teresa e Junior
2

Juga perhatikan bahwa beberapa file di bawah /proc/izin untuk dimonitor untuk perubahan melalui polling, misalnya jika Anda melakukannya, man procAnda dapat membaca yang berikut tentang /proc/self/mountsfile:

/ proc / [pid] / mounts (sejak Linux 2.4.19) File ini mencantumkan semua filesystem yang saat ini dipasang di proses namespace mount (lihat mount_namespaces (7)). Format file ini didokumentasikan dalam fstab (5).

Sejak kernel versi 2.6.15, file ini dapat di-polling: setelah membuka file untuk dibaca, perubahan pada file ini (mis. Mount filesystem atau unmount) menyebabkan pilih (2) untuk menandai deskriptor file sebagai memiliki kondisi yang luar biasa, dan polling (2) dan epoll_wait (2) menandai file sebagai memiliki acara prioritas (POLLPRI). (Sebelum Linux 2.6.30, perubahan pada file ini ditunjukkan oleh deskriptor file yang ditandai sebagai dapat dibaca untuk pilih (2), dan ditandai sebagai memiliki kondisi kesalahan untuk polling (2) dan epoll_wait (2).)

Dan itulah yang sedang dilaksanakan dalam pertanyaan berikut:

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

Nelson
sumber
-1

Coba gunakan netlinkuntuk memonitor /procfile yang diubah.

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

meyao
sumber
Selamat datang di situs ini. Harap tambahkan beberapa penjelasan tentang cara menggunakan netlinkuntuk mencapai tugas itu; itu tidak terlihat dari konten eksternal yang Anda tautkan. Selain itu, secara umum lebih disukai untuk tidak memiliki jawaban "hanya tautan" karena konten eksternal dapat berubah atau dihapus (lihat pemberitahuan di atas halaman Anda yang awalnya ditautkan, misalnya), yang akan mengurangi manfaat kontribusi Anda.
AdminBee