Execution d'un job sur un evennement avec systemd

felix via gull <gull-04vmY7CpswVinyhjFObuvR+/[email protected]>
Newsgroups gmane.org.user-groups.gull.general
Message-ID <[email protected]>
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  -  <[email protected]>  -  http://www.f-hauri.ch
_______________________________________________
gull mailing list
[email protected]
https://forum.linux-gull.ch/mailman/listinfo/gull
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.