通知 /proc 下文件的更改

Ter*_*ior 14 proc inotify

我在 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
Run Code Online (Sandbox Code Playgroud)

我正在寻找的是类似的东西(这个例子不起作用):

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
Run Code Online (Sandbox Code Playgroud)

这样,只有在$codec文件发生实际更改时,才会运行循环内的命令。

gol*_*cks 12

我正在寻找的是某种方式来获取文件更改的通知 [in proc]

你不能,因为它们不是文件。这不是一个重复的问题,但这里的答案解释了原因。

/proc是内核接口。那里没有真正的文件,因此它们无法更改。从句柄读取是一个请求,当您读取文件时,文件中的数据是对该请求的回复。

您可以模拟这样的事情的唯一方法是每隔一段时间读取文件并比较内容以查看内核的回复是否已更改 - 看起来您已经这样做了。

如果您statprocfs 文件,atime 和 mtime 将是相同的:对于某些文件,它是 stat 调用的时间,而对于其他文件,它是在系统启动期间的时间。在第一种情况下,它似乎总是会改变,在第二种情况下,它似乎永远不会改变。


小智 5

如果您使用的是 PulseAudio,pactl subscribe请执行此操作。