2 votes

Commandes ne s'exécutent pas dans le script shell lancé par udev

Je rencontre des problèmes pour utiliser udev afin d'exécuter un script shell qui sauvegarde mes disques durs sur un disque externe chaque fois que le disque externe est connecté via USB. Tout fonctionne sauf l'appel effectif à rdiff-backup. Udev détecte le disque dur et appelle le script correctement. Le script s'exécute et affiche correctement les notifications sur le bureau, mais rdiff-backup n'est jamais exécuté par le script shell et le script se termine immédiatement sans sauvegarder les disques. J'ai déjà modifié mon fichier sudoers pour que le script ait les autorisations appropriées.

Je suis conscient que Cuttlefish me permettrait d'effectuer cette action relativement facilement, mais dans le souci de m'instruire sur la méthode générale, je préférerais beaucoup apprendre à utiliser les outils déjà intégrés à Linux pour accomplir ceci par moi-même. Toute aide serait grandement appréciée.

Mes règles udev sont définies comme suit :

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

et mon script shell est le suivant :

#!/bin/bash
#sudo su

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

logger "Sauvegarde des répertoires racine et home sur un disque externe..."

###SAUVEGARDE DU RÉPERTOIRE RACINE
#Émettre une notification système pour le début de la sauvegarde
sv=$(date "+%T")
msgvar="Début de la sauvegarde du répertoire / sur un disque externe à "
notif=${msgvar}${sv}
sudo -u nam DISPLAY=":0.0" notify-send -t 1000 "$notif"
#notify-send -t 1000 "$notif" 
logger "$notif"

#sleep 5
#Démarrer la sauvegarde du répertoire /
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"

#Émettre une notification système pour la fin de la sauvegarde
sv=$(date "+%T")
stt=$SECONDS
et=$(($stt - $st))
#notify-send -t 1000 "Sauvegarde du répertoire / terminée à $sv. 
#Le processus a pris $et secondes."
sudo -u nam DISPLAY=":0.0" notify-send -t 1000 "Sauvegarde du répertoire / terminée à $sv. 
Le processus a pris $et secondes."

###SAUVEGARDE DU RÉPERTOIRE HOME
#Émettre une notification système pour le début de la sauvegarde
sv=$(date "+%T")
msgvar="Début de la sauvegarde du répertoire /home sur un disque externe à "
notif=${msgvar}${sv}
#notify-send -t 1000 "$notif" 
sudo -u nam DISPLAY=":0.0" notify-send -t 1000 "$notif"

#Démarrer la sauvegarde du répertoire /home
#sudo rdiff-backup -v6 --force /home/ /media/nam/BACKUP1/home/
sudo su
sudo /usr/bin/rdiff-backup -v6 /home/ /media/nam/BACKUP1/home/

#Émettre une notification système pour la fin de la sauvegarde 
sv=$(date "+%T")
stt=$SECONDS
et=$(($stt - $st))
#notify-send -t 1000 "Sauvegarde du répertoire /home terminée à $sv. 
#Le processus a pris $et secondes."
sudo -u nam DISPLAY=":0.0" notify-send -t 1000 "Sauvegarde du répertoire /home terminée à $sv. 
Le processus a pris $et secondes."

2voto

meva Points 158

Supprimez la ligne sudo su. Cela démarre un nouveau shell root qui ne revient jamais et c'est pourquoi toute commande après cela n'est pas exécutée.

De plus, se donner la permission d'exécuter sudo su sans mot de passe est un risque sérieux pour la sécurité et ne devrait pas être fait dans un environnement réel.

0voto

user.dz Points 45060

Je pourrais remarquer quelques problèmes prévus :

  1. La condition de correspondance devrait vérifier cette assignment ATTR{idProduct}="0621" qui devrait être une égalité ATTR{idProduct}=="0621" .

  2. Cette règle s'exécutera avant le montage des partitions et peut-être même avant la lecture de la table des partitions.

    Exemple avec une clé USB branchée :

    $ udevadm monitor -u
    monitor affichera les événements reçus pour :
    UDEV - l'événement que udev envoie après le traitement de la règle
    
    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)

    Cette règle cible le noeud du périphérique USB /devices/pci0000:00/0000:00:0b.0/usb1/1-1/1-1:1.0 où il est plus pratique de cibler les noeuds des partitions exemple /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. Ajoutez le nom du noeud KERNEL et utilisez ATTRS pour la correspondance des règles.

    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. Même avec la modification précédente, les règles peuvent s'exécuter avant le montage donc vous avez besoin d'un délai. Autre chose, UDEV ne peut pas exécuter des tâches longues, donc si rdiff-backup ne se termine pas rapidement, il sera tué par UDEV. Voir man udev

    Pour résoudre cela, créez un nouveau processus puis détache-le. Voir comme dans cette réponse : Pourquoi mes règles udev s'exécutent si j'utilise udevadm trigger, mais PAS au démarrage ?

SistemesEz.com

SystemesEZ est une communauté de sysadmins où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X