/proc 下のファイル変更通知

/proc 下のファイル変更通知

私はbashでヘッドフォンが検出されたらヘッドフォンに切り替え、それ以外の場合はPulseAudioを使用して外部USBスピーカーに切り替える小さな「デーモン」を作成しました。

私が探しているのは、ファイルの変更に関する通知を実際のファイルの/proc/asound/card0/codec#0ように受け取る方法です(/procの下のファイルを「偽のファイル」として扱います)。inotifywait

sleep 1私のコードは一日中実行されているのでawk(たとえば、1日に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

答え1

私が探しているのは、[プロセス内]ファイルの変更に関する通知を受け取る方法です。

ファイルではないのでできません。重複した質問ではありませんが、答えはここにあります理由を説明しました。

/procカーネルインタフェースです。そこには実際のファイルがないので変更できません。ハンドルから読むのは必要ファイルを読み取るとき、ファイルのデータはそれに対する答えです。

同様の状況をシミュレートする唯一の方法は、定期的にファイルを読み取り、内容を比較してカーネルの応答が変更されたことを確認することです。こうやったようです。

procfs ファイルを使用する場合、statatime と mtime は同じです。一部のファイルの場合は stat 呼び出し時間、他のファイルの場合はシステムの開始時間です。最初のケースでは常に変化しているように見えますが、2番目のケースではまったく変わっていないようです。

答え2

PulseAudio を使用している場合は、pactl subscribe次の手順を実行します。

答え3

また、ポーリングによって特定のファイルの変更を監視することが許可されていることに注意してください/proc/。たとえば、これにより、ファイルman procについて次の内容を読み取ることができます。/proc/self/mounts

/proc/[pid]/mounts (Linux 2.4.19 以降) このファイルは、プロセスのマウント名前空間に現在マウントされているすべてのファイルシステムを一覧表示します (mount_namespaces(7) を参照)。このファイルの形式はfstab(5)に文書化されています。

カーネルバージョン2.6.15以降、このファイルはポーリング可能です。ファイルを読み取るために開いた後、このファイルの変更(ファイルシステムのマウントやマウント解除など)により、select(2)はファイル記述子に例外があることを示します。 (2)とepoll_wait(2)は、ファイルに優先順位イベント(POLLPRI)があることを示します。 (Linux 2.6.30より前では、このファイルの変更はファイル記述子として表示され、select(2)では読み取り可能としてマークされ、poll(2)およびepoll_wait(2)ではエラー状態としてマークされました。)

これは、次の質問で実装されます。

https://stackoverflow.com/questions/5070801/monitoring-mount-point-changes-via-proc-mounts

答え4

ファイルの変更をnetlink監視するために使用してみてください。/proc

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

関連情報