[gull] Execution d'un job sur un evennement avec systemd

felix felix at f-hauri.ch
Mon Jan 10 09:14:18 CET 2022


Bonjour,

J'utilise rsync pour synchroniser un répertoire vers un serveur distant.

Coté client rsync, j'execute périodiquement un job qui ressemble à:

   # -- SyncData
   lvcreate -s -L ${SnapSize}M -n bkup vg/data
   mount /dev/vg/bkup /mnt
   touch /mnt
   rsync -zaSD --zc zstd --delete --numeric-ids --exclude=... \
             /mnt/. rsync://target:/data/.
   umount /mnt
   lvremove -f vg/bkup

Le `touch` me permet de repérer le moment de la dernière synchronisation.
Coté serveur rsync (@target), je fais:

   # -- CpLinkData
   root=data
   cd "/path/backups/" || exit 1
   test -d "$root" || exit 1
   cpylink=$(date -r "$root" +"$root-%Y-%m-%d-%Hh%M")
   [ -d "$cpylink" ] || cp -al "$root" "$cpylink"

Voilà.
J'utilise ensuite un script pour effacer les backups afin de n'en conserver
que les N dernier(e)s { heures, jours, semaines, mois, années }. ( ce script
est un peu lourd (wc -> 238  886 6958) et pas très propre, je l'envoie en
l'état à qui me le demande, mais ne le publie pas tout de suite... )

Coté serveur (@target), le meilleur moment pour executer le `cp -al', c'est
au moment où une dernière synchronisation se termine.

Parce que je n'ai pas trouvé le moyen de déclancher une action sur un
evennement, comme la fin d'un sous-process du serveur rsync, je fais:

   # -- cron 1' avant le client...
   doLink() {  ... cp -al ...  ;}
   while IFS=$' :[]\t\r\n' read -u $jnl _{,,,,,,} pid _ cmd && ((pid)) ;do
       case "$cmd" in 
       'connect'*)     read _ _ _from[pid] <<< "$cmd"  ;;
       'rsync to'*)    read _ _ _to[pid] _ <<< "$cmd"  ;;
       'sent '*)
           [ "${_from[pid]%%.*}" = "clienthost" ] &&
               [ "${_to[pid]%%/*}" = "data" ] && break 
           unset _from[pid] _to[pid]
           ;;
       esac
   done {jnl}< <(journalctl -axu rsync -fn 0)
   [ "${_from[pid]%%.*}" = "clienthost" ] &&
        [ "${_to[pid]%%/*}" = "data" ] &&     doLinks

Je repère ansi qu'il s'agit bien d'un ``rsync TO @target'', que le from
est bien le ``clienthost'', que le dossier concerné est bien ``data'' et
que la synchonisation s'est terminée avec le message ``sent ...''.

Le script créé un verrou afin de s'assurer qu'il ne s'execute pas 2x.

Donc ma question: Avec le révolutionaire systemd et son journald,
existe-t-il un moyen de traquer la fin d'un ``rsync'', avec le
topo de ce qui à été synchonisé de manière plus simple/propre,
en utilisant des triggers plus simples à créer?

-- 
 Félix Hauri  -  <felix at f-hauri.ch>  -  http://www.f-hauri.ch


More information about the gull mailing list