Een goede manier om bestanden te verwerken/verwerken die op willekeurige tijdstippen zijn gemaakt, is door incron
te gebruiken in plaats van cron
. (Opmerking:aangezien incron de inotify
van de Linux-kernel gebruikt syscalls, deze oplossing werkt alleen met Linux.)
Terwijl cron
voert een taak uit op basis van datums en tijden, incron
voert een taak uit op basis van wijzigingen in een bewaakte map. U kunt bijvoorbeeld incron configureren om een taak uit te voeren telkens wanneer een nieuw bestand wordt gemaakt of gewijzigd.
Op Ubuntu heet het pakket incron
. Ik ben niet zeker van RedHat, maar ik geloof dat dit het juiste pakket is:http://rpmfind.net//linux/RPM/dag/redhat/el5/i386/incron-0.5.9-1.el5.rf. i386.html
.
Nadat u het incron-pakket hebt geïnstalleerd, leest u
man 5 incrontab
voor informatie over het instellen van het incrontab-configuratiebestand. Uw incron_config
bestand kan er ongeveer zo uitzien:
/var/ss01/ IN_CLOSE_WRITE /path/to/processing/script.py $#
/var/ss02/ IN_CLOSE_WRITE /path/to/processing/script.py $#
/var/ss03/ IN_CLOSE_WRITE /path/to/processing/script.py $#
/var/ss04/ IN_CLOSE_WRITE /path/to/processing/script.py $#
Om deze configuratie vervolgens te registreren met de incrond-daemon, zou je
. uitvoerenincrontab /path/to/incron_config
Dat is alles. Wanneer nu een bestand wordt aangemaakt in /var/ss01, /var/ss02, /var/ss03 of /var/ss04, wordt het commando
/path/to/processing/script.py $#
wordt uitgevoerd, waarbij $# wordt vervangen door de naam van het nieuw gemaakte bestand.
Hierdoor is het niet meer nodig om hashes op te slaan/te vergelijken, en bestanden worden slechts één keer verwerkt - onmiddellijk nadat ze zijn gemaakt.
Zorg ervoor dat uw verwerkingsscript niet naar het hoogste niveau van de gecontroleerde mappen schrijft. Als dit het geval is, zal incrond het nieuwe bestand dat is gemaakt opmerken en script.py opnieuw starten, waardoor u in een oneindige lus terechtkomt.
incrond controleert individuele mappen en controleert submappen niet recursief. U kunt tshark dus opdracht geven om naar /var/ss01/tobeprocessed te schrijven, incron gebruiken om/var/ss01/tobeprocessed te controleren en uw script.py bijvoorbeeld naar /var/ss01 laten schrijven.
ps. Er is ook een python-interface om te inotificeren, genaamd pyinotify . In tegenstelling tot incron kan pyinotify submappen recursief controleren. In jouw geval denk ik echter niet dat de recursieve controlefunctie nuttig of noodzakelijk is.