Come eseguire un comando quando vengono aggiornati i contenuti di una directory?


27

C'è una directory i Acui contenuti sono cambiati frequentemente da altre persone.

Ho creato una directory personale in Bcui conservo tutti i file che sono mai stati A.

Attualmente, solo di tanto in tanto correre rsyncper ottenere i file per eseguire il backup da Aa B. Tuttavia, temo la possibilità che alcuni file vengano aggiunti Ae quindi rimossi da Aprima che io abbia la possibilità di copiarli B.

Qual è il modo migliore per evitare che ciò accada? Idealmente, mi piacerebbe che il mio attuale script di backup Avenisse eseguito ogni volta che il contenuto di viene modificato.

Risposte:


29

Se hai installato inotify-tools puoi usare inotifywaitper attivare un'azione se un file o una directory sono scritti in:

#!/bin/sh
dir1=/path/to/A/
while inotifywait -qqre modify "$dir1"; do
    /run/backup/to/B 
done

Dove l' -qqinterruttore è completamente silenzioso, -rricorsivo (se necessario) ed -eè l'evento da monitorare, in questo caso modify. Da man inotifywait:

modifica
È stato scritto un file guardato o un file all'interno di una directory controllata.

5
incrondpotrebbe anche essere di interesse.
Shawn J. Goff,

1
Freddo. Vorrei solo mettere lo script sopra nel mio bashrc in modo che venga eseguito quando accedo? C'è un altro modo in cui posso farlo funzionare tutto il tempo?
oadams,

Per l'accesso, sì /etc/profileper tutto il sistema o .bash_profilesolo per il tuo utente. Per eseguirlo dopo l'avvio, dipende dal tuo sapore di Unix / Linux; /etc/rc.local, /etc/rc.d/oppure/etc/init.d/
jasonwryan,

1
Per le directory più grandi potresti prendere in considerazione l'uso dello --monitorswitch (e invece di reindirizzare l'output al tuo loop), altrimenti c'è un sacco di sovraccarico quando inotifywaitviene ricominciato continuamente
Tobias Kienzler

Quanto funzionerebbe in modo affidabile questa soluzione per eseguire uno script per ogni file che è stato aggiunto in un albero di directory attraverso un server FTP (diciamo che un nuovo file viene aggiunto ogni 3 minuti in media e potrebbe andare avanti per anni)? Se non molto, esiste una soluzione alternativa?
Nikola Novak,

5

A rigor di termini, se qualcuno rilascia un file e lo rimuove molto rapidamente, potresti perderlo. L'uso di inotify (sotto Linux o una funzione simile sotto altri unices) rende piccola la finestra del rischio.

Se riesci a montare il filesystem di tua scelta su quella directory (mi rendo conto che potrebbe non essere un'opzione), puoi metterne uno che registra tutte le versioni dei file, ad esempio copyfs .


4

Prova lo entrstrumento da riga di comando che può eseguire comandi arbitrari quando i file cambiano. Dalla versione 2.9, è -dstata aggiunta un'opzione watch directory ( ) per reagire agli eventi quando un nuovo file viene aggiunto a una directory.

Esempio per eseguire l'utilità se un nuovo file viene aggiunto al progetto:

$ while true; do
> echo src/* | entr -d your_command
> done

Nella modalità di controllo della directory, la directory principale di ciascun file viene aggiunta implicitamente all'elenco di controllo.

L'unica conseguenza di ciò è che se appare un nuovo file deve uscire per consentire a un loop di shell esterno di ripetere la scansione del file system.

Ecco la versione senza un'opzione watch directory:

$ while true; do
> echo src/* src | entr your_command
> done

Ecco un esempio più semplice a seconda delle tue esigenze:

$ ls -d * | entr sh -c 'rsync -vuar A B'

Controllare: sito Web entrproject.org per maggiori dettagli.


Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.