Surveiller files images et _posts

Surveiller files images et _posts

Notes › _DIFFUSION

Pour ce besoin, utilisez inotify, via inotifywait du paquet inotify-tools.

  • inotify : idéal pour déclencher immédiatement un script lors de créations, modifications, suppressions ou déplacements.
  • auditd : plutôt destiné à l’audit de sécurité et à la traçabilité — utilisateur, processus, appels système, journaux persistants. Il est plus lourd et moins pratique pour lancer directement une action.

inotify signale des événements système comme CREATE, CLOSE_WRITE, DELETE et MOVED_TO; attention, les événements de déplacement peuvent arriver en deux parties et ne sont pas atomiques.

Script synchro local distant

Exécuter ce dry-run : il affichera les fichiers qui seraient copiés, mis à jour ou supprimés, sans effectuer aucune modification.

1
2
3
4
5
6
7
for dir in files images _posts; do
  echo "=== Simulation : ${dir} ==="
  rsync -avzn --delete --itemize-changes \
    -e "ssh -p 55229 -i /home/yann/.ssh/vm-105" \
    "/home/yann/media/statique/${dir}/" \
    "debjek@192.168.0.229:/home/debjek/chirpy/${dir}/"
done

Lecture rapide du résultat

  • >f+++++++++ fichier : fichier qui serait ajouté sur le serveur.
  • >f..t...... fichier : fichier qui serait mis à jour, par exemple parce que sa date diffère.
  • *deleting fichier : fichier qui serait supprimé du serveur à cause de --delete.
  • Aucune ligne de changement : le dossier local et le dossier distant sont déjà synchronisés.

-n signifie --dry-run : ni copie ni suppression ne seront réalisées.

1. Installer inotify-tools

1
sudo pacman -S inotify-tools

2. Créer le script de synchronisation

Créer le fichier :

1
2
mkdir -p /home/yann/bin
nano /home/yann/bin/traiter-media.sh

Contenu :

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
#!/usr/bin/env bash

set -u

# Empêche deux synchronisations simultanées
exec 9>/tmp/rsync-media-statique.lock

if ! flock -n 9; then
    echo "Une synchronisation est déjà en cours."
    exit 0
fi

for dir in files images _posts; do
  echo "=== Synchro : ${dir} ==="
  rsync -avz --delete --itemize-changes \
    -e "ssh -p 55229 -i /home/yann/.ssh/vm-105" \
    "/home/yann/media/statique/${dir}/" \
    "debjek@192.168.0.229:/home/debjek/chirpy/${dir}/"
done

Rendre le script exécutable :

1
chmod +x /home/yann/bin/traiter-media.sh

Cette commande synchronise :

1
2
3
/home/yann/media/statique/files/   → /home/debjek/chirpy/files/
/home/yann/media/statique/images/  → /home/debjek/chirpy/images/
/home/yann/media/statique/_posts/  → /home/debjek/chirpy/_posts/

Tester manuellement :

1
/home/yann/bin/traiter-media.sh

3. Créer le script de surveillance inotify

Créer le fichier :

1
nano /home/yann/bin/surveiller-media.sh

Contenu :

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
#!/usr/bin/env bash

set -u

WATCH_ROOT="/home/yann/media/statique"
SYNC_SCRIPT="/home/yann/bin/traiter-media.sh"

inotifywait \
    --monitor \
    --recursive \
    --format '%e|%w%f' \
    --event create \
    --event close_write \
    --event delete \
    --event moved_to \
    --event moved_from \
    "$WATCH_ROOT/files" \
    "$WATCH_ROOT/images" \
    "$WATCH_ROOT/_posts" |
while IFS='|' read -r events path; do
    echo "Événement détecté : $events — $path"

    # Petit délai pour éviter de réagir à des événements en rafale
    sleep 1

    "$SYNC_SCRIPT"
done

Rendre le script exécutable :

1
chmod +x /home/yann/bin/surveiller-media.sh

Tester au premier plan :

1
/home/yann/bin/surveiller-media.sh

Dans un autre terminal, créez ou modifiez un fichier :

1
touch /home/yann/media/statique/_posts/test.md

Vous devriez voir rsync s’exécuter. Arrêtez ensuite le test avec Ctrl+C.

4. Créer le service systemd utilisateur

Créer le répertoire si nécessaire :

1
mkdir -p /home/yann/.config/systemd/user

Créer le service :

1
nano /home/yann/.config/systemd/user/surveiller-media.service

Contenu :

1
2
3
4
5
6
7
8
9
10
11
[Unit]
Description=Surveillance et synchronisation des fichiers media

[Service]
Type=simple
ExecStart=/home/yann/bin/surveiller-media.sh
Restart=on-failure
RestartSec=2

[Install]
WantedBy=default.target

5. Activer le service

Recharger la configuration systemd utilisateur :

1
systemctl --user daemon-reload

Activer le service au démarrage de la session :

1
systemctl --user enable surveiller-media.service

Le démarrer immédiatement :

1
systemctl --user start surveiller-media.service

Ou, en une seule commande :

1
systemctl --user enable --now surveiller-media.service

6. Vérifier le fonctionnement

État du service :

1
systemctl --user status surveiller-media.service

Afficher les journaux en direct :

1
journalctl --user -u surveiller-media.service -f

Tester avec une modification :

1
echo "Test inotify" >> /home/yann/media/statique/_posts/test.md

7. Commandes d’administration

Arrêter le service :

1
systemctl --user stop surveiller-media.service

Redémarrer le service :

1
systemctl --user restart surveiller-media.service

Désactiver le démarrage automatique :

1
systemctl --user disable --now surveiller-media.service

Voir les événements détectés par inotify :

1
2
3
4
5
6
inotifywait \
    --monitor \
    --recursive \
    --format '%T %e %w%f' \
    --timefmt '%F %T' \
    /home/yann/media/statique/{files,images,_posts}

La chaîne finale est donc :

1
2
3
4
5
6
7
8
9
modification manuelle
        ↓
inotifywait
        ↓
surveiller-media.sh
        ↓
traiter-media.sh
        ↓
rsync vers le serveur distant