BACKUP: lancer duplicity au branchement d'un disque dur

Bonjour à tous!

Voulant lancer un backup de mon /home à chaque branchement d’un dd spécifique, j’ai pensé procéder de la manière suivante:

  • Créer une règle udev pour lancer un script lors du branchement du dd. Voici donc le contenu de mon /etc/udev/rules/90-myrules.rules :

ACTION==“add”, KERNEL==“sd?1”, SUBSYSTEM==“block”, ATTR{size}==“1953521664”, ATTR{start}==“2048”,\ RUN+=“/usr/local/bin/backupHome.sh”

  • Le fameux script /usr/local/bin/backupHome.sh:

#!/bin/sh
# Attente du dd
sleep 25
touch /root/test
# Montage de la partition
touch /root/testMontage
mount /dev/sdb1 /mnt/
echo 1 >> /root/testMontage
# Gestion des logs
cat /var/log/duplicity/oldBackup.log >> /var/log/duplicity/historicBackup.log
cp -v /var/log/duplicity/lastBackup.log /var/log/duplicity/oldBackup.log
touch /root/testLog
echo 1 >> /root/testLog
# Précision du mot de passe
PASSPHRASE=motdepasse
export PASSPHRASE
# Lancement du backup
duplicity /home file:///mnt/ > /var/log/duplicity/lastBackup.log
touch /root/testDupl
echo 1 >> /root/testDupl
unset PASSPHRASE
# Démontage de la partition
umount /dev/sdb1
touch /root/testUmount
echo 1 >> /root/testUmount
# Envoi du log par mail
mail -s “Log duplicity” thewatcher@mondomaine.tld< /var/log/duplicity/lastBackup.log

Pourquoi tous ces fichiers test? On y arrive…
En lançant manuellement mon script, il tourne nickel.

Lorsque je branche mon dd, le script se lance, pour preuve la présence de ces différents fichiers test dans mon /root. Néanmoins, le script semble alors s’arrêter au lancement de duplicity. Pour preuve:

  • j’ai bien les fichiers test jusqu’au testLog, mais pas les suivants.
  • sdb1 est encore montée sous /mnt/.
  • je ne reçois pas le mail.

Je soupçonne l’export de la PASSPHRASE de ne pas se comporter de la même manière quand le script est lancé par udev, mais rien de certain… Un coup de main?

Redirige la sortie d’erreur de duplicity dans le log, tu en apprendras d’avantage.

Ok, par sûr que ce soit ça, mais j’ai rajouté les options -v9 --log-file /root/logDuplicity à la commande de duplicity dans le script.

Manifestement, le problème ne vient pas de la PASSPHRASE comme je le pensais, puisque j’obtiens un rapport tout à fait classique, sans erreurs, mais qui s’arrête alors qu’il évoque la comparaison entre un fichier et sa sauvegarde.

Ça semble plutôt cohérent, puisqu’avec top lancé en parallèle, je vois que le processus duplicity tourne pendant un peu plus de 30 secondes avant de disparaître…

J’avoue ne pas comprendre :confused:

EDIT: voici ce que me donne service udev status:

Jan 13 23:51:06 YunoHost systemd-udevd[3307]: timeout ‘/usr/local/bin/backupHome.sh’
Jan 13 23:51:07 YunoHost systemd-udevd[3307]: timeout: killing ‘/usr/local/bin/backupHome.sh’ [3315]
Jan 13 23:51:07 YunoHost systemd-udevd[3307]: ‘/usr/local/bin/backupHome.sh’ [3315] terminated by signal 9 (Killed)

Hum, apparemment on ne pourrait pas lancer de scripts trop longs avec udev, si j’en crois ce lien :confused:

Dans ce cas, tu peux utiliser un script plus court qui démarre le second script en arrière plan.
Ça te devrait t’éviter un timeout.

Oui, je suis en train de tester ça… Je reviens dans 10 minutes :wink:

Bon, j’ai donc créer un script /usr/local/bin/backupRelay.sh, qui fonctionne jusqu’au bout lancé manuellement, mais udev continue de kill le second (j’ai bien sûr modifié la règle udev pour lancer ce script). Voici le contenu initial du script:

#!/bin/sh /usr/local/bin/backupHome.sh & exit

J’ai aussi tenté ça:

#!/bin/sh nohup /usr/local/bin/backupHome.sh & exit

Mais non, toujours le même résultat.
EDIT: je vais essayer avec at.

Sans doute que le second script reste un fils du premier…

Reste la solution (sale) de créer une tache cron à la volée pour exécuter le second script, qui supprimera la tâche cron.

#YEEEEEEEEES !
Avec at, ça roule tout seul !

Petit récap:

  1. Créer une règle udev (/etc/udev/rules.d/90-myrules.rules):

ACTION==“add”, KERNEL==“sd?1”, SUBSYSTEM==“block”, ATTR{size}==“1953521664”, ATTR{start}==“2048”, RUN+=“/chemin/vers/script/relais”

  1. Créer un script relais pour éviter le timeout imposé par udev:

#!/bin/sh at now +1 minutes -f /chemin/vers/script/backup

  1. Créer un script de backup:

#!/bin/sh
sleep 5

# Montage de la partition
mount /dev/sdb1 /mnt/

# Gestion des logs
cat /var/log/duplicity/oldBackup.log >> /var/log/duplicity/historicBackup.log
cp /var/log/duplicity/lastBackup.log /var/log/duplicity/oldBackup.log

# Précision du mot de passe
PASSPHRASE=motdepasse
export PASSPHRASE

# Lancement du backup
duplicity /home file:///mnt/ > /var/log/duplicity/lastBackup.log

# Démontage de la partition
umount /dev/sdb1

# Envoi du log par mail
mail -s “Log duplicity” mail@domaine.tld < /var/log/duplicity/lastBackup.log

1 Like

Je ne connaissais pas at, intéressant, ce serait un genre de cron à usage unique ?
C’est plus propre que mon cron qui se supprime lui-même

C’est exactement ça, tu peux spécifier une date, une heure, ou un délai. Une doc sympa :wink:

Merci pour la doc.
Je la lirais demain, mon cerveau est déjà parti se coucher :dizzy_face:

Merci pour ton aide :slight_smile: