inotifywait close_write не срабатывает при добавлении папок в просматриваемый каталог

#linux #bash #ubuntu #inotify #inotifywait

#linux #bash #ubuntu #inotify #inotifywait

Вопрос:

Я пытаюсь создать копию завершенных файлов, которые сохраняются в папке сохранения торрента. Я создал скрипт bash, используя inotifywait для просмотра папки. Мой оригинальный скрипт отлично работал с файлами и папками / вложенными папками. Как только я заменил «-e create -e moved_to» на «-e close_write», он больше не распознает папки, сохраненные в папке просмотра. Теперь он работает только с файлами. Причина, по которой мне нужно перейти на это, заключается в том, что многие мои файлы большие (и многократно хранятся в папках), и для их полного сохранения требуется некоторое время, и скрипт выполняет все процессы до их завершения.

Я также пробовал команду «ждать», но она вообще ничего не делает. Я знаю, что есть более сложные / лучшие / правильные способы его использования, но я еще не разобрался в них.

Вот пример моего скрипта. Любые рекомендации будут оценены с благодарностью. Я не очень хорошо разбираюсь в написании bash-скриптов, так что извините, если это беспорядок.

 WATCHED=/mnt/Seeding
DESTINATION=/mnt/Complete-Torrents
user=userid
group=groupid
perms=777

# Step 1 - Copying completed torrents to Complete-Torrents folder leaving original torrents to seed 
inotifywait -m -e close_write --format %f $WATCHED 
    | while read new
        do
            echo Detected new torrent $new, Copying to Complete-Torrents folder
            cp -r "$WATCHED/$new" "$DESTINATION/"
            wait
                          
# Step 2 - Deleting unwanted files from Complete-Torrents folder

            echo Deleting unwanted files from Complete-Torrents folder
            find $DESTINATION -type f -iname "*.txt" -delete
            find $DESTINATION -type f -iname "*.nfo" -delete
            find $DESTINATION -type f -iname "*.website" -delete
            find $DESTINATION -type f -iname "*.exe" -delete
            find $DESTINATION -type f -iname "*.html" -delete
            find $DESTINATION -type f -iname "*.htm" -delete
            find $DESTINATION -type f -iname "*.sfv" -delete
            find $DESTINATION -type f -iname "*.parts" -delete
            find $DESTINATION -type f -iname "*.jpg" -delete
            find $DESTINATION -type f -iname "*.png" -delete
            find $DESTINATION -type f -iname "*.doc" -delete
            sleep 10
                           
# Step 3 - Change permissions of new files in Complete-Torrents folder

            echo Changing ownership and permissions to Complete-Torrents folder and files
            chown -R $user:$group "$DESTINATION"
            chmod -R $perms "$DESTINATION"
                           
        done
 

Спасибо,
Шон

Редактировать…

Я не могу заставить этот скрипт даже увидеть новую папку, добавленную в папку просмотра. Это буквально НИЧЕГО не делает. Если я заменю close_write на create amp; moved_to и не внесу никаких других изменений, он увидит папку и содержимое и обработает их правильно. Я нахожу это очень странным.

На самом деле я даже пытался создать небольшой тестовый скрипт, чтобы посмотреть, смогу ли я заставить его работать с инструкцией if / elif / else, но еще раз, когда я копирую папку в папку просмотра, скрипт ничего не делает (даже не выполняет цикл). Если я помещаю файл, он выдает правильный вывод.

Вот тестовый скрипт, который я запустил. Может ли кто-нибудь еще подтвердить, могут ли они правильно распознать и обработать новую папку?

 #!/bin/bash
WATCHED=/mnt/Watched
inotifywait -re close_write --format '%w%f' -m $STEP1_WATCHED 
    | while read -r new
        do
            if [[ -d "$new" ]]; then            
            echo "Detected new folder $new"
            elif [[ -f "$new" ]]; then            
            echo "Detected new file $new"
            else
            echo "neither $new"
            fi
            done
    done
 

Комментарии:

1. Что такое $STEP1_WATCHED ?

2. Не слишком ли много «сделано» в тестовом скрипте?

3. Я ничего не понимаю,. Вы читали инструкцию? Что он говорит, что close_write делает? Can someone else confirm if they can get a new folder to be recognized and processed correctly? Зачем вам это нужно, становится ясно после прочтения справочной страницы, которая close_write не обнаружит создание новой папки. В нем говорится A watched file or a file within a watched directory was closed, after being opened in writeable mode — почему вы ожидаете, что создание каталога будет обнаружено?

4. Камильчук … Вау. Хороший улов. Да, я много раз просматривал руководство и по какой-то причине не заметил, что оно применимо только к файлам. Я думаю, если бы там было написано «close_write не обнаружит создание новой папки», я бы это уловил. Но вы правы. Спасибо за улов!

5. Roadowl… Да, вы правы в отношении дополнительного «готово». Камильчук указал, что close_write не видит папок, поэтому моя основная проблема на данный момент не является проблемой. Но теперь мне нужно найти другой способ сделать то, что мне нужно. Спасибо за помощь.

Ответ №1:

Оказывается, проблема здесь была моей ошибкой. За все время, что я читал руководство inotify, я почему-то не понял, что это работает только для файлов, а не для папок. Я, очевидно, искал что-то конкретное и замалчивал то, что говорилось в руководстве о close_write.

Спасибо всем, кто помог!