Proc

通知 /proc 下文件的更改

  • October 12, 2021

我在 bash 中編寫了一個小型“守護程序”,如果檢測到耳機,它將切換到耳機,如果沒有,則使用 PulseAudio 切換到外部 USB 揚聲器。

我正在尋找的是某種獲取文件更改通知的方法/proc/asound/card0/codec#0,就像inotifywait對真實文件所做的那樣(將 /proc 下的文件視為“偽文件”)。

我發現我的程式碼有點瘋狂,因為它執行sleep 1awk一整天,即每天 86400 次 :)

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

我正在尋找的是類似的東西(這個例子不起作用):

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

這樣,循環內的命令只有在文件發生真正更改時才會執行$codec

我正在尋找的是某種獲取文件更改通知的方法

$$ in proc $$

你不能,因為它們不是文件。這不是一個完全重複的問題,但這裡的答案解釋了原因。

/proc是核心介面。那裡沒有真正的文件,因此它們無法更改。子句柄中讀取是一個請求,當您讀取文件時,文件中的數據是對它的回复。

您可以模擬這樣的事情的唯一方法是每隔一段時間讀取文件並比較內容以查看來自核心的回復是否已更改 - 看起來您已經這樣做了。

如果您stat對文件進行處理,則 atime 和 mtime 將是相同的:對於某些文件,它是 stat 呼叫的任何時間,對於其他文件,它是系統啟動期間的時間。在第一種情況下,它似乎總是改變了,在第二種情況下,它似乎永遠不會改變。

引用自:https://unix.stackexchange.com/questions/90627