Как я могу отслеживать новые файлы (созданные / перемещенные) в каталоге Redhat Linux, используя только инструменты по умолчанию? - PullRequest
0 голосов
/ 23 января 2019

Я пытаюсь написать скрипт, который будет брать файлы из определенного каталога и копировать их в другой каталог на Redhat-сервере Linux.Рассматриваемые файлы будут иметь имя abc ###. Doc, где «#» будет представлять число.Всякий раз, когда новый файл перемещался или создавался в этом каталоге и имел имя, я хотел бы, чтобы файл был немедленно скопирован в другой каталог.Например, предположим, что каталог уже содержит эти файлы:

abc001.doc
abc002.doc
abc003.doc

И затем был добавлен новый файл, так что теперь это выглядит так:

abc001.doc
abc002.doc
abc003.doc
abc004.doc

Я бы хотел ТОЛЬКОФайл abc004.doc для копирования.Затем, если были добавлены еще два файла, такие как abc005.doc и abc006.doc, они также будут скопированы без копирования предыдущих четырех файлов.

При попытке найти решениена это первое, на что я посмотрел, было inotifywait .Тем не менее, это требует от нас, чтобы установить его на сервере Linux.К сожалению, из-за настроек безопасности в нашей среде мы не можем этого сделать.

Я также увидел интересный подход с использованием python: https://askubuntu.com/questions/893019/monitor-folder-and-run-command-if-there-is-a-file-there. Однако проблема в том, что он ищетлюбые файлы там и перемещает их.Для моей конкретной проблемы файлы не будут перемещены из этого каталога, а скорее скопированы.Поэтому он будет копировать все файлы в формате abc ###. Doc, а не только новые.

Единственное, что я мог бы подумать, это, возможно, иметь список имен файлов, которые уже были обработаны.и просто добавить к этому, как новые файлы приходят и обрабатываются.Но, безусловно, есть более элегантный способ решения моей проблемы ...

Существуют ли другие инструменты, которые уже поставляются с Linux, которые я мог бы использовать для решения этой проблемы?

1 Ответ

0 голосов
/ 23 января 2019

inotify является довольно стандартным на большинстве систем Linux.Интерфейс предоставляется ядром.Если в системе есть стандартный компилятор C, вы можете создать инструмент очень легко.Многие интерпретаторы (perl, python, php-cli ...) и Mono также имеют интерфейсы.Кажется, что нет прямого интерфейса для создания часов inotify из оболочки.

Если у вас нет инструментов для использования inotify, у вас не будет выбора, кроме как сделать опрос.Чем дольше задержка, которую можно терпеть, тем лучше.Вы можете использовать «стандартный инструмент» stat , чтобы увидеть, когда ваш каталог был последний раз изменен, и отслеживать его, а также вы можете использовать «стандартный инструмент» find , чтобы увидеть, какие файлы былиизменено с того времени, когда оно меняется.

inotify, безусловно, предпочтительнее, поскольку он просто блокирует скрипт с помощью read (2) до тех пор, пока не будет внесено изменение, и сразу же предпримет действия.Пока я не знаю, какие инструменты доступны, я не могу представить решение для вас, которое использует это.

Далее следует решение без inotify:

#!/bin/bash

export SourceDir="/whatever"
export DestDir="/whatever else"

# assume that everything is in sync as of now
# we could save/load last_mtime in a file if this is a bad assumption
last_mtime=`stat "${SourceDir}" -c %Y`
while true; do
    new_mtime=`stat "${SourceDir}" -c %Y`
    if (( ${new_mtime} > ${last_mtime} )); then
        ls "${SourceDir}" | while read filename ; do
            if [ -f "${filename}" ]; then
                file_mtime=`stat "${filename}" -c %Y`
                if (( ${file_mtime} > ${last_mtime} )); then
                    cp "${SourceDir}/${filename}" "${DestDir}"
                fi
            fi
        done
        export last_mtime=${new_mtime}
    fi
    # wait 5 seconds before we check again
    sleep 5
done

вам придется запустить скрипт вфон постоянно (возможно, начать с nohup или что-то)если бы вы могли выдержать задержку до 1 минуты или более, вы могли бы убрать цикл while и спать и запустить его с помощью cron (при условии, что в ваших «стандартных инструментах» есть cron) или даже просто использовать cron и rsync (при условииу вас есть rsync) и никаких дополнительных сценариев.

...