Execute uma regra do udev para uma unidade flash USB quando o computador é iniciado com o dispositivo inserido

1

Eu quero que o meu sistema de servidor Ubuntu 15.04 x64 execute um script sempre que uma determinada unidade flash for inserida. Então, criei um arquivo de regras personalizado com o seguinte conteúdo

ACTION=="add",SUBSYSTEM=="usb",ATTR{idVendor}=="my-vendor",ATTR{idProduct}=="my-id",RUN+="/var/scripts/my-script.sh"

O script executado sempre que a unidade flash é inserida, mas eu tenho dois problemas com ela:

1) O script aparentemente não é executado quando o computador é (re) iniciado com a unidade já inserida. Existe alguma maneira de executar o script após a inicialização se a unidade flash já estiver conectada?

2) O script quer montar o dispositivo, mas se eu tentar montar o dispositivo como

mount LABEL=mylabel /some/path

ou

mount UUID=my-uuid /some/path

A fonte não pode ser encontrada. Atualmente eu inseri um

sleep 5s

no meu script, mas isso não parece ser uma solução confiável. Existe alguma maneira (tolerante a falhas) de esperar que o sistema seja suficientemente inicializado?

Para fins de teste, o script continha apenas

#!/bin/sh
date >> /tmp/test.log
    
por muffel 27.09.2015 / 12:25

1 resposta

1

As regras para ações add são executadas durante a inicialização do sistema, se o dispositivo estiver presente. Isso é feito executando udevadm info --action=add em um sistema SysVinit e internamente em um sistema Upstart ou Systemd. No entanto, isso acontece muito cedo no processo de inicialização, no momento em que o sistema de arquivos raiz ainda é montado como somente leitura e os sistemas de arquivos de /etc/fstab ainda não estão montados. Não tenho certeza se /run já está disponível nesse ponto. Isso pode ser muito cedo para o que seu script precisa fazer.

A maneira rápida e portátil, mas portátil, de executar seu script durante a inicialização seria executá-lo a partir de /etc/rc.local , condicionalmente se o dispositivo estivesse presente.

if [ -e /dev/disk/by-id/… ]; then
  /var/scripts/my-script.sh
fi

Tenha em atenção que existe uma possível condição de corrida se o dispositivo for inserido durante o arranque: o script será executado assim que o dispositivo for detectado e, em seguida, novamente a partir de /etc/rc.local .

Uma solução mais limpa seria definir uma unidade de sistema e declarar as dependências necessárias em seu script. Você ainda precisa tomar cuidado com a possível condição de corrida.

    
por 28.09.2015 / 11:07