2009-02-04 16 views
21

Podobnie jak w przypadku similar SO question, próbuję monitorować katalog na Linuksie w celu dodania nowych plików i chciałbym natychmiast przetworzyć nowe pliki po ich dostarczeniu. Wszelkie pomysły na najlepszy sposób realizacji tego?Monitorowanie katalogu zmian

Odpowiedz

23

Spójrz na inotify.

Inotify umożliwia oglądanie katalogu w celu utworzenia pliku.

+3

Inotify nie obsługuje rekursywnie oglądania katalogów, co oznacza, że ​​osobny zegarek inotify musi być utworzony dla każdego podkatalogu. Pamiętaj o tym. – Jason

+0

Zobacz także pakiet o nazwie [incron] (http://inotify.aiken.cz/?section=incron&page=why) i jego [strona man] (http://linux.die.net/man/5/incrontab). Nie wiem, jak obsługuje podfoldery. – BeowulfNode42

+0

Nie, incron nie obsługuje podfolderów, całkowicie zawiedziony w odpowiedniej kampanii "indiegogo", a incron drzemał w 2012 roku. Smutny, ale osiągnął ślepy zaułek. Naprawdę mam nadzieję, że inotify pozostanie ;-) – Frunsi

0

Jednym z rozwiązań, o których myślałem, jest stworzenie "słuchacza plików" połączonego z zadaniem cron. Nie szaleję za tym, ale myślę, że to może zadziałać.

+0

Jeśli chcesz je przetworzyć jak najszybciej, nie ma możliwości inotify. –

25

najpierw upewnij inotify-tools w zainstalowana.

następnie wykorzystać je tak:

logOfChanges="/tmp/changes.log.csv" # Set your file name here. 

# Lock and load 
inotifywait -mrcq $DIR > "$logOfChanges" & 
IN_PID=$$ 

# Do your stuff here 
... 

# Kill and analyze 
kill $IN_PID 
while read entry; do 
    # Split your CSV, but beware that file names may contain spaces too. 
    # Just look up how to parse CSV with bash. :) 
    path=... 
    event=... 
    ... # Other stuff like time stamps? 
    # Depending on the event… 
    case "$event" in 
    SOME_EVENT) myHandlingCode path ;; 
    ... 
    *) myDefaultHandlingCode path ;; 
done < "$logOfChanges" 

Alternatywnie, przy użyciu --format zamiast -c na inotifywait byłby pomysł.

Po prostu man inotifywait i man inotifywatch, aby uzyskać więcej informacji.

Można również użyć incron i użyć go do wywołania skryptu obsługi.

+1

Dzięki, najlepsza odpowiedź do tej pory. Byłem pewien, że jest coś fajnego z inotify i to jest dokładnie to. – akostadinov