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 inotifywait
que en los archivos reales (considerando que los archivos bajo / proc son como "pseudo-archivos").
Encuentro mi código un poco loco, porque funciona sleep 1
con awk
todo 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 $codec
archivo.
top
y los monitores del sistema GUI leen mucho más que eso/proc
a 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é.
/proc
es 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
stat
procesa 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 subscribe
hace esto.fuente
subscribe
en 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/mounts
archivo: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
netlink
para controlar los/proc
archivos modificados.https://mdlayher.com/blog/linux-netlink-and-go-part-1-netlink/
fuente
netlink
para 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.