Notificar cambios en un archivo bajo / proc

13

He escrito un pequeño 'demonio' ​​en bash que cambiará a los auriculares si se detectan, y si no, cambiará a un altavoz USB externo con PulseAudio.

Lo que estoy buscando es alguna forma de recibir notificaciones de cambios en el archivo /proc/asound/card0/codec#0, al igual inotifywaitque en los archivos reales (considerando que los archivos bajo / proc son como "pseudo-archivos").

Encuentro mi código un poco loco, porque funciona sleep 1con awktodo el día, es decir 86400 veces al día :)

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

Lo que estoy buscando es algo como (este ejemplo no funciona):

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

De esta forma, los comandos dentro del bucle se ejecutarán solo cuando haya cambios reales en el $codecarchivo.

Teresa e Junior
fuente
1
No es una locura: cosas como topy los monitores del sistema GUI leen mucho más que eso /proca intervalos cortos. Por supuesto, probablemente lo hacen de manera mucho más eficiente como ejecutables compilados, pero el punto es: la búsqueda de información es una tarea común.
Ricitos de oro
2
Dado que el problema de fondo no es única para usted, me gustaría esperar que haya alguna solución lista para usar (al menos para algunos tipos de hardware) - echar un vistazo a unix.stackexchange.com/questions/25776/... y superuser.com/questions / 339900 /… . La fuente final es, por supuesto, el árbol de kernel (y las especificaciones de hardware si decide implementarlo en algún controlador).
Peter
1
Si esto aparece /proc, probablemente puedas activar tu script con una regla udev , lo cual sería bastante ideal. Menos ideal es lo tedioso que puede ser crear reglas de udev;)
goldilocks
@peterph De lo que pude reunir, hda-verb proporciona una interfaz para configurar o verificar parámetros, pero parece que también tendré que ejecutarlo cada segundo.
Teresa e Junior
@goldilocks Conectar los auriculares no envía ningún evento udev. ¿O hay algo más que me estoy perdiendo?
Teresa e Junior

Respuestas:

10

Lo que estoy buscando es alguna forma de recibir notificaciones de cambios en el archivo [en proceso]

No puedes, porque no son archivos. Esta no es una pregunta duplicada, pero la respuesta aquí explica por qué.

/proces una interfaz de kernel No hay archivos reales allí, por lo tanto, no pueden cambiar. Leer desde los identificadores es una solicitud y los datos en el archivo cuando lo lees son una respuesta a eso.

La única forma de simular algo como esto sería leer el archivo a intervalos y comparar el contenido para ver si la respuesta del núcleo ha cambiado, parece que ya lo ha hecho.

Si statprocesa archivos, el atime y el mtime serán los mismos: para algunos archivos es cada vez que la llamada de estadísticas fue, para otros un tiempo desde el inicio del sistema. En el primer caso, siempre parecerá haber cambiado, en el segundo, nunca parecerá haber cambiado.

encerrada dorada
fuente
Desafortunadamente, incluso sondearlo cada segundo agrega una latencia considerable (por ejemplo, 500 ms). Esperaba que hubiera una forma más rápida / más eficiente de hacer esto, pero como has mencionado que las aplicaciones como top lo hacen de la misma manera, creo que lo dejaré así.
Teresa e Junior
@TeresaeJunior Si la latencia es un problema (creo que no está aquí), p. Ej., Debido a que la duración de la encuesta se usa en un cálculo, usted calculará la duración real (y no solo el tiempo que solicitó para dormir) . Sin embargo, eso parece mucho; Nunca he perfilado scripts de bash, así que no sé qué sería normal aquí (hmm ... buena pregunta por separado). Invocar awk == fork()y cosas así es costoso; Las utilidades escritas todas en C tendrían, como se mencionó, métodos más rápidos. Todavía no creo que esté agregando mucha carga al sistema en general.
Ricitos de oro
1
No, lo siento, en realidad quise decir: desde el momento en que conecto los auriculares hasta el próximo sueño, hay un retraso notable. Pero no planeo disminuir el tiempo de sueño. ¡Gracias por tu ayuda!
Teresa e Junior
4

Si está utilizando PulseAudio, pactl subscribehace esto.

usuario66233
fuente
Si, de hecho! Empecé a usarlo después de compilar PA 4.0 hace unos meses debido a algunos problemas de audio. La versión en Debian Stable es 2.0 (aunque han subido 4.0 a backports recientemente), y no había ninguna subscribeen 2.0.
Teresa e Junior
2

También tenga en cuenta que algunos archivos bajo /proc/permiso permiten ser monitoreados para cambios a través de sondeo, por ejemplo, si lo hace man proc, puede leer lo siguiente sobre el /proc/self/mountsarchivo:

/ proc / [pid] / mounts (desde Linux 2.4.19) Este archivo enumera todos los sistemas de archivos actualmente montados en el espacio de nombres de montaje del proceso (ver mount_namespaces (7)). El formato de este archivo está documentado en fstab (5).

Desde la versión del kernel 2.6.15, este archivo se puede sondear: después de abrir el archivo para leerlo, un cambio en este archivo (es decir, un sistema de archivos montado o desmontado) hace que select (2) marque el descriptor del archivo como que tiene una condición excepcional, y poll (2) y epoll_wait (2) marcan que el archivo tiene un evento de prioridad (POLLPRI). (Antes de Linux 2.6.30, un cambio en este archivo se indicaba cuando el descriptor del archivo se marcaba como legible para select (2) y se marcaba como que tenía una condición de error para poll (2) y epoll_wait (2)).

Y eso es exactamente lo que se está implementando en la siguiente pregunta:

/programming/5070801/monitoring-mount-point-changes-via-proc-mounts

Nelson
fuente
-1

Intente utilizar netlinkpara controlar los /procarchivos modificados.

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

meyao
fuente
Bienvenido al sitio. Agregue alguna explicación sobre cómo usar netlinkpara lograr esa tarea; no es evidente por el contenido externo que vinculó. Además, en general se prefiere no tener respuestas "solo de enlace", ya que el contenido externo puede cambiar o eliminarse (consulte el aviso en la parte superior de su página vinculada originalmente, por ejemplo), lo que disminuiría la utilidad de su contribución.
AdminBee