Por que minhas regras do udev são executadas se eu usar o gatilho do udevadm, mas NÃO no momento da inicialização?

5

Estou tendo problemas com as regras do udev que não estão em execução. Aqui está um exemplo:

Eu tenho uma regra /etc/udev/rules.d/99-test.rules que contém:

ACTION=="add", SUBSYSTEM=="pci", ATTR{vendor}=="0x8086", RUN+="/sayhi"

E sayhi apenas tem:

#!/bin/bash
date +"%Y-%m-%d %H:%M:%S,%3N" >> /saidhi

Sendo esta uma máquina Intel, eu obviamente tenho muitos dispositivos PCI 0x8086 de fornecedores:

root@imtrobot:~# lspci -n |grep 8086
00:00.0 0600: 8086:2770 (rev 02)
00:02.0 0300: 8086:2772 (rev 02)
00:1d.0 0c03: 8086:27c8 (rev 01)
[ etc. 12 lines total ]

Ainda assim, quando eu inicializo, /saidhi não será criado, ou terá 1 ou 2 linhas de data.

Se, após a inicialização, eu executar udevadm trigger --action=add --subsystem-match=pci , então /saidhi receberá exatamente o número correto de datas adicionadas a ele.

Por que isso não funciona durante o processo de inicialização?

    
por dmd 10.04.2014 / 03:39

3 respostas

1

Eu realmente tenho uma maneira que vai esperar a quantidade certa de tempo, não um 30sec arbitrário. Eu fiz isso no Raspberry Pi para montar automaticamente todos os discos USB conectados na conexão, mas também no tempo de inicialização.

A regra é semelhante à sua:

$ sudo cat /etc/udev/rules.d/10-usb_automount.rules 
KERNEL=="sd*", RUN+="/home/pi/bin/usb-automount"

Agora, o script é, na verdade, uma chamada recursiva (e sei que isso é mal):

$ cat /home/pi/bin/usb-automount
#!/bin/sh

ROOT_RW='mount | grep 'dev/root' | grep -E '\(.*rw.*\)''

if [ -z "$ROOT_RW" ]; then
 sleep 3 
 /home/pi/bin/usb-automount & disown
else
 /home/pi/bin/usb-automount.sh
fi

Note que o "grep 'dev / root'" é específico do sistema operacional Raspbian, portanto, no Ubuntu você precisará projetar seu próprio grep para detectar os rootfs (ou até mesmo projetar um pouco mais de grep universal). Observe que o script se chamará em segundo plano e sairá, e somente se o rootfs for "rw" irá chamar o script de montagem correto. O script "/home/pi/bin/usb-automount.sh" faz a montagem real ou, no seu caso, o registro em log.

Observe que esse script ainda leva 3 segundos para ser executado, então você pode otimizar ainda mais mudando para:

if [ -z "$ROOT_RW" ]; then
 ( sleep 3; /home/pi/bin/usb-automount ) & disown
else
 /home/pi/bin/usb-automount.sh
fi

No entanto, nunca verifiquei isso e não sei se isso funcionará como esperado (não sou um guru de scripts).

    
por Fëamarto 12.06.2015 / 10:55
1

Como mencionado por outros, os processos iniciados pela diretiva udev RUN= devem ser execução curta . Gostaria de sugerir outra maneira mais simples de desacoplar o processo de execução longa de udev usando o planejador do sistema at command:

ACTION=="add", SUBSYSTEM=="pci", ATTR{vendor}=="0x8086", RUN+="/usr/bin/at -M -f /sayhi now"

Apenas certifique-se de que o seu script /sayhi seja /bin/sh compatible - este é o shell que o at usa.

    
por Alex P. 19.03.2018 / 20:15
0

Eu ensinei da mesma causa que @dmd, uevents PCI vêm antes de montar o sistema de arquivos como rw . (Mas às vezes, alguns dos eventos da PCI vêm depois, condição de corrida, trabalhando em paralelo)

dmesg | grep -i -e mount -e pci

@Sparhawk sleep ideia parece boa para mim. Eu acho que é por isso que não funciona (Ref: man udev ):

  

Isso só pode ser usado para tarefas de primeiro plano com execução muito curta.   Executar um processo de evento por um longo período de tempo pode bloquear   mais eventos para este ou um dispositivo dependente.

     

Iniciar daemons ou outros processos de execução longa não é apropriado   para udev; os processos bifurcados, separados ou não, serão   incondicionalmente morto após o término do tratamento do evento.

Então, criei um novo script que inicia & amp; disown do script que possui o comando sleep . Na verdade, isso funciona!

$ ls -l /sa*
-rw-r--r-- 1 root root 1104 Oct 24 12:37 /saidhi
-rwxr-xr-x 1 root root   29 Oct 24 12:31 /sayhi
-rwxr-xr-x 1 root root   62 Oct 24 12:28 /sayhi2

$ cat /sayhi
#!/bin/bash
/sayhi2 & disown

$ cat /sayhi2 
#!/bin/bash
sleep 30
date +"%Y-%m-%d %H:%M:%S,%3N" >> /saidhi

$ cat /etc/udev/rules.d/99-test.rules 
ACTION=="add", SUBSYSTEM=="pci", ATTR{vendor}=="0x8086", RUN+="/sayhi"
    
por user.dz 24.10.2014 / 14:40

Tags