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 inotifywait
halnya pada file nyata (mempertimbangkan file di bawah / proc sebagai "file semu").
Saya menemukan kode saya sedikit gila, karena berjalan sleep 1
dengan awk
untuk 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 $codec
file.
top
dan monitor sistem GUI banyak membaca lebih dari itu dari/proc
pada interval pendek. Tentu saja, mereka mungkin melakukannya jauh lebih efisien sebagai executable yang dikompilasi, tetapi intinya adalah: mencari informasi adalah tugas bersama./proc
, Anda mungkin dapat memicu skrip Anda dengan aturan udev , yang akan sangat ideal. Yang kurang ideal adalah betapa membosankannya membuat aturan udev;)Jawaban:
Anda tidak bisa, karena mereka bukan file. Ini bukan pertanyaan duplikat, tetapi jawabannya di sini menjelaskan alasannya.
/proc
adalah 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
stat
menghasilkan 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.sumber
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.Jika Anda menggunakan PulseAudio,
pactl subscribe
lakukan ini.sumber
subscribe
pada 2.0.Juga perhatikan bahwa beberapa file di bawah
/proc/
izin untuk dimonitor untuk perubahan melalui polling, misalnya jika Anda melakukannya,man proc
Anda dapat membaca yang berikut tentang/proc/self/mounts
file:Dan itulah yang sedang dilaksanakan dalam pertanyaan berikut:
/programming/5070801/monitoring-mount-point-changes-via-proc-mounts
sumber
Coba gunakan
netlink
untuk memonitor/proc
file yang diubah.https://mdlayher.com/blog/linux-netlink-and-go-part-1-netlink/
sumber
netlink
untuk 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.