
Estoy ejecutando RHEL6 y estoy intentando escribir una regla udev que se activa al conectar y quitar dispositivos USB. Creé un archivo llamado 80-usb.rules
in /etc/udev/rules.d/
y le di el siguiente contenido (hasta ahora nada demasiado específico, solo quiero probar):
ACTION=="add", SUBSYSTEMS=="usb", RUN+="touch /tmp/test"
Guardé el archivo y conecté una unidad USB para probar. Sin embargo, el archivo /tmp/test
no fue creado.
Calculo que mi regla udev debería coincidir con mi unidad USB, ya que puedo ejecutarla udevadm info
en la unidad USB y al menos uno de los dispositivos principales tiene el atributo SUBSYSTEMS=="usb"
.
¿Por qué podría no activarse la regla udev?
Intenté ejecutarlo udevadm test --action=add /path/to/device
y está claro que el .rules
archivo que escribí se está procesando y que mis reglas coinciden. Aquí hay algunas líneas relevantes del resultado:
parse_file: reading '/etc/udev/rules.d/80-usb.rules' as rules file
udev_rules_apply_to_event: RUN '/bin/touch /tmp/test' /etc/udev/rules.d/80-usb.rules:1
udevadm_test: run: '/bin/touch /tmp/test'
Pero aún así, /tmp/test
no existe. Estoy muy confundido. Es evidente que esta regla se está cumpliendo y se están aplicando. Entonces, ¿por qué no se ejecuta el comando especificado por RUN
?
Respuesta1
Su regla debe dar una ruta absoluta para el ejecutable:
ACTION=="add", SUBSYSTEMS=="usb", RUN+="/usr/bin/touch /tmp/test"
Editar:
Y si desea ejecutar un script, debe indicar qué shell lo ejecutará:
ACTION=="add", SUBSYSTEMS=="usb", RUN+="/bin/sh /path/to/your/script"
Respuesta2
Tienes que asegurar lo siguiente:
- Las rutas en el
RUN
comando deben ser absolutas. - El archivo tiene que ser ejecutable.
- El
PATH
entorno está limitado dentro de la ejecución de su comando.
Al principio agregue este archivo de script a/lib/udev/touch.sh
vim /lib/udev/touch.sh
en ese archivo escribe:
#!/bin/bash
touch /tmp/test
hacerlo ejecutable:
chmod +x /lib/udev/touch.sh
y cambie su archivo de reglas a:
ACTION=="add", SUBSYSTEMS=="usb", RUN+="/lib/udev/touch.sh"
recarga tus reglas udev
udevadm control --reload-rules
Esto leerá tus reglas /lib/udev/rules.d/*
nuevamente. Los cambios no se aplicarán hasta ahora.
Tenga en cuenta que udev ejecuta su script en un PATH
entorno reducido. Debe asegurarse de que se pueda acceder a cualquier binario que no esté dentro de las rutas configuradas con una ruta completa. También puedes ampliar el PATH
entorno dentro de tu script.
Verifique qué ruta está definida registrando la set
salida en un archivo de registro desde su script contenedor:
set >>/tmp/udev-env-test
Podría verse así:
PATH='/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin'