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.

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./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;)Respuestas:
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.fuente
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.Si está utilizando PulseAudio,
pactl subscribehace esto.fuente
subscribeen 2.0.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 haceman proc, puede leer lo siguiente sobre el/proc/self/mountsarchivo:Y eso es exactamente lo que se está implementando en la siguiente pregunta:
/programming/5070801/monitoring-mount-point-changes-via-proc-mounts
fuente
Intente utilizar
netlinkpara controlar los/procarchivos modificados.https://mdlayher.com/blog/linux-netlink-and-go-part-1-netlink/
fuente
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.