web-dev-qa-db-ja.com

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

私はbashで小さな 'デーモン'を作成しました。検出された場合はヘッドフォンに切り替わり、検出されなかった場合はPulseAudioで外部USBスピーカーに切り替わります。

私が探しているのは、実際のファイルに対してinotifywaitが行うのと同じように、ファイル/proc/asound/card0/codec#0に対する変更の通知を取得するいくつかの方法です(/ procの下のファイルを「疑似ファイル」と見なす) 。

awkを使用して終日sleep 1を実行するため、コードは少し異常です。つまり、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ファイルに実際の変更があった場合にのみ実行されます。

13
Teresa e Junior

私が探しているのは、ファイルの変更の通知を取得するいくつかの方法です[プロセス内]

それらはファイルではないため、できません。これはまったく同じ質問ではありませんが、 ここでの答え が理由を説明しています。

/procはカーネルインターフェイスです。そこには実際のファイルがないため、変更できません。ハンドルからの読み取りは要求であり、読み取り時のファイル内のデータはその応答です。

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

stat procfsファイルの場合、atimeとmtimeは同じになります。ファイルによっては、stat呼び出しが行われたときはいつでも、その他の場合はシステムブート中からの時間です。前者の場合は常に変化しているように見え、後者の場合は変化したようには見えません。

10
goldilocks

PulseAudioを使用している場合は、pactl subscribeはこれを行います。

4
user66233

また、/proc/たとえば、man procについて次のように読むことができます/proc/self/mountsファイル:

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

カーネルバージョン2.6.15以降、このファイルはポーリング可能です。読み取りのためにファイルを開いた後、このファイルの変更(つまり、ファイルシステムのマウントまたはアンマウント)により、select(2)はファイル記述子に例外条件があるとマークします。 poll(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

2
Nelson