Comandos não executados no script shell executado pelo udev

2

Estou com problemas para usar o udev para executar um script de shell que faz o backup dos meus discos rígidos em uma unidade externa sempre que a unidade externa estiver conectada via USB. Tudo funciona, exceto a chamada real para o rdiff-backup. O udev detecta o disco rígido e chama o script corretamente. O script é executado e exibe as notificações da área de trabalho corretamente, mas o rdiff-backup nunca é executado pelo script de shell e o script é executado para terminar imediatamente, sem precisar fazer o backup das unidades. Eu já editei meu arquivo sudoers para que o script tenha as permissões apropriadas.

Estou ciente de que o Cuttlefish permitiria que eu realizasse essa ação com relativa facilidade, mas no interesse de me instruir sobre o método geral, eu preferiria muito mais aprender a usar as ferramentas já embutidas no Linux para fazer isso em meu próprio. Qualquer ajuda seria muito apreciada.

Minhas regras do udev são definidas como:

ACTION=="add", SUBSYSTEM=="usb", ATTR{idVendor}=="1f75", ATTR{idProduct}="0621", RUN+="/home/nam/.scripts/backup_root_and_home_folders_to_external_drive.sh"

e meu script de shell é o seguinte:

#!/bin/bash
#sudo su

export DISPLAY=:0
export XAUTHORITY=/home/nam/.Xauthority

logger "Backing up root and home directories to external drive..."

###BACKUP ROOT DIRECTORY
#Issue system notification for backup begin
sv=$(date "+%T")
msgvar="Backing up directory / to external drive started at "
notif=${msgvar}${sv}
sudo -u nam DISPLAY=":0.0" notify-send -t 1000 "$notif"
#notify-send -t 1000 "$notif" 
logger "$notif"

#sleep 5
#Start backup of / directory
st=$SECONDS
#sudo rdiff-backup -v6 --force --exclude /sys --exclude /run --exclude /media --exclude /proc --exclude /home / /media/nam/BACKUP1/root
sudo su
/usr/bin/rdiff-backup -v6 --exclude /sys --exclude /run --exclude /media --exclude /proc --exclude /home / /media/nam/BACKUP1/root
#logger "$ok"

#Issue system notification for backup end
sv=$(date "+%T")
stt=$SECONDS
et=$(($stt - $st))
#notify-send -t 1000 "Backup of directory / completed at $sv. 
#Process took $et seconds."
sudo -u nam DISPLAY=":0.0" notify-send -t 1000 "Backup of directory / completed at $sv. 
Process took $et seconds."


###BACKUP HOME DIRECTORY
#Issue system notification for backup begin
sv=$(date "+%T")
msgvar="Backing up directory /home to external drive started at "
notif=${msgvar}${sv}
#notify-send -t 1000 "$notif" 
sudo -u nam DISPLAY=":0.0" notify-send -t 1000 "$notif"


#Start backup of /home directory
#sudo rdiff-backup -v6 --force /home/ /media/nam/BACKUP1/home/
sudo su
sudo /usr/bin/rdiff-backup -v6 /home/ /media/nam/BACKUP1/home/


#Issue system notification for backup end 
sv=$(date "+%T")
stt=$SECONDS
et=$(($stt - $st))
#notify-send -t 1000 "Backup of directory /home completed at $sv. 
#Process took $et seconds."
sudo -u nam DISPLAY=":0.0" notify-send -t 1000 "Backup of directory /home completed at $sv. 
Process took $et seconds."
    
por Nick Hudspeth 14.10.2014 / 00:45

2 respostas

2

Remova a linha sudo su . Ele inicia um novo shell de root que nunca retorna e é por isso que qualquer comando depois disso não está sendo executado.

Além disso, conceder a você mesmo permissão para fazer sudo su sem senha é um sério risco de segurança e não deve ser feito em um ambiente real.

    
por sмurf 14.10.2014 / 02:19
0

Eu pude notar alguns problemas esperados:

  1. Deve haver uma condição de correspondência para verificar essa atribuição ATTR{idProduct}="0621" que deve ser uma igualdade ATTR{idProduct}=="0621" .

  2. Essa regra será executada antes de montar as partições e pode ser até mesmo antes de ler a tabela de partições.

    Exemplo com disco flash apenas conectado:

    $ udevadm monitor -u
    monitor will print the received events for:
    UDEV - the event which udev sends out after rule processing
    
    UDEV  [8850.369941] add      /devices/pci0000:00/0000:00:0b.0/usb1/1-1 (usb)
    UDEV  [8850.374279] add      /devices/pci0000:00/0000:00:0b.0/usb1/1-1/1-1:1.0 (usb)
    UDEV  [8850.378578] add      /devices/pci0000:00/0000:00:0b.0/usb1/1-1/1-1:1.0/host4 (scsi)
    UDEV  [8850.380505] add      /devices/pci0000:00/0000:00:0b.0/usb1/1-1/1-1:1.0/host4/scsi_host/host4 (scsi_host)
    UDEV  [8851.373706] add      /devices/pci0000:00/0000:00:0b.0/usb1/1-1/1-1:1.0/host4/target4:0:0 (scsi)
    UDEV  [8851.373727] add      /devices/pci0000:00/0000:00:0b.0/usb1/1-1/1-1:1.0/host4/target4:0:0/4:0:0:0 (scsi)
    UDEV  [8851.377944] add      /devices/pci0000:00/0000:00:0b.0/usb1/1-1/1-1:1.0/host4/target4:0:0/4:0:0:0/scsi_disk/4:0:0:0 (scsi_disk)
    UDEV  [8851.380841] add      /devices/pci0000:00/0000:00:0b.0/usb1/1-1/1-1:1.0/host4/target4:0:0/4:0:0:0/bsg/4:0:0:0 (bsg)
    UDEV  [8851.382182] add      /devices/pci0000:00/0000:00:0b.0/usb1/1-1/1-1:1.0/host4/target4:0:0/4:0:0:0/scsi_generic/sg2 (scsi_generic)
    UDEV  [8851.382563] add      /devices/pci0000:00/0000:00:0b.0/usb1/1-1/1-1:1.0/host4/target4:0:0/4:0:0:0/scsi_device/4:0:0:0 (scsi_device)
    UDEV  [8851.399453] add      /devices/virtual/bdi/8:16 (bdi)
    UDEV  [8852.542377] add      /devices/pci0000:00/0000:00:0b.0/usb1/1-1/1-1:1.0/host4/target4:0:0/4:0:0:0/block/sdb (block)
    UDEV  [8853.591178] add      /devices/pci0000:00/0000:00:0b.0/usb1/1-1/1-1:1.0/host4/target4:0:0/4:0:0:0/block/sdb/sdb2 (block)
    UDEV  [8853.591724] add      /devices/pci0000:00/0000:00:0b.0/usb1/1-1/1-1:1.0/host4/target4:0:0/4:0:0:0/block/sdb/sdb1 (block)
    

    Essa regra segmenta o nó do dispositivo USB /devices/pci0000:00/0000:00:0b.0/usb1/1-1/1-1:1.0 , onde é mais conveniente segmentar o exemplo dos nós de partição /devices/pci0000:00/0000:00:0b.0/usb1/1-1/1-1:1.0/host4/target4:0:0/4:0:0:0/block/sdb/sdb1 . Adicione KERNEL nome do nó e use ATTRS para correspondência de regras.

    ACTION=="add", KERNEL="sdb?", SUBSYSTEM=="usb", ATTRS{idVendor}=="1f75", ATTRS{idProduct}=="0621", RUN+="/home/nam/.scripts/backup_root_and_home_folders_to_external_drive.sh"
    
  3. Mesmo com o mod anterior, as regras podem ser executadas antes da montagem, então você precisa de um atraso. Outra coisa, UDEV não pode executar tarefas longas, por isso, se rdiff-backup não terminar em breve, será morto pela UDEV. Veja man udev

    Para resolvê-los, crie um novo processo e, em seguida, ignore-o. Veja como nesta resposta: Por que minhas regras do udev são executadas se eu usar udevadm trigger , mas NÃO no tempo de inicialização?

por user.dz 16.10.2015 / 13:21