[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