Como executar um script (quando a memória USB é conectada) automaticamente no Debian Jessie (Raspberry Pi)?

2

Estou trabalhando com o Raspberry Pi. Anteriormente, eu usei udev rule para executar um script quando uma memória flash usb foi conectada. O seguinte foi o conteúdo de /etc/udev/rules.d/10-usbstick.rules file:

ACTION=="add", SUBSYSTEM=="block", KERNEL=="sd[a-z]1" SYMLINK+="usbflash", RUN+="/path/to/myhup.sh"

E, em seguida, em myhup.sh :

#!/bin/sh
nohup /path/to/myscript.sh

Este método funcionou bem. Quando uma memória flash usb foi conectada, ela automaticamente começou a executar o arquivo myscript.sh .

No entanto, depois de atualizar para Jessie, não funciona. Ao conectar uma memória flash USB, ele apresenta os seguintes erros:

[ 2026.652130] sd 0:0:0:0: [sda] No Caching mode page found
[ 2026.652238] sd 0:0:0:0: [sda] Assuming drive cache: write through
[ 2029.532163] ntfs: (device sda1): check_mft_mirror(): $MFT and $MFTMirr (record 0) do not match.  Run ntfsfix or chkdsk.
[ 2029.532355] ntfs: (device sda1): load_system_files(): $MFTMirr does not match $MFT.  Mounting read-only.  Run ntfsfix and/or chkdsk.

Eu decidi usar o método systemd service . Então eu mudei o udev rule para:

ACTION=="add", SUBSYSTEM=="block", KERNEL=="sd[a-z]1" SYMLINK+="usbflash", RUN+="systemctl start myusb.service"

E criou o myusb.service com o seguinte conteúdo:

[Unit]
Description=run myscript
[Service]
Type=oneshot
ExecStart=/path/to/myscript.sh
[Install]
WantedBy=multi-user.target

E então:

sudo chmod 644 /lib/systemd/system/myusb.service
sudo systemctl daemon-reload
sudo systemctl enable myusb.service
sudo reboot

Desta vez, não funcionou novamente e deu os seguintes erros:

[ 2026.652130] sd 0:0:0:0: [sda] No Caching mode page found
[ 2026.652238] sd 0:0:0:0: [sda] Assuming drive cache: write through

Então, como posso executar um script automaticamente quando uma memória flash USB é conectada (em Jessie)?

    
por Omid1989 01.06.2016 / 12:36

1 resposta

1

Se você deseja executar uma unidade systemd a partir do seu udev, agora é possível nomear a unidade (consulte man systemd.device ). Por exemplo, se você olhar em seu (/ usr) /lib/udev/rules.d/99-systemd.rules , deverá encontrar um exemplo como

SUBSYSTEM=="bluetooth", TAG+="systemd", ENV{SYSTEMD_WANTS}+="bluetooth.target"

que tem os 2 pontos importantes: você deve adicionar o TAG systemd e deve definir o SYSTEMD_WANTS para o nome (base) da sua unidade. Se nenhuma regra usar SYSTEMD_WANTS , provavelmente sua versão ainda não suportará esse recurso.

Então, no seu caso, temos

ACTION=="add", SUBSYSTEM=="block", KERNEL=="sd[a-z]1", SYMLINK+="usbflash", TAG+="systemd", ENV{SYSTEMD_WANTS}+="myusb.service"

Note que você tinha uma vírgula ausente na regra do udev. Note que os 2 erros que você lista para [sda] são apenas informativos, e não um problema.

    
por 01.06.2016 / 18:47