2012-03-22 4 views
2

Возможно ли рассчитать последнее измененное время в каталоге, принимая во внимание изменение содержимого файла?Последнее изменение времени в каталоге на основе содержащегося содержимого файла?

Мы пытаемся посмотреть серию каталогов выгрузки, чтобы определить, когда пользовательские сеансы FTP завершены.

Пользователи загружают набор файлов в определенный каталог, и мы хотели бы обнаружить, когда последний файл в этом каталоге не изменился в течение N минут. (Мы используем это в качестве прокси-сервера для «FTP сессии делается».)

Мы начали с этим, чтобы найти каталоги, которые были простаивает более 5, но менее 10, минут:

find . -mmin +5 -mmin -10 -type d -ls 

Используемая здесь временная метка каталога основана на времени, когда последний каталог был добавлен в каталог.

Я читал Directory last modified date, и ясно, что чтение mtime или mmin для каталога не будет работать, поскольку оно не изменяется, когда файлы в каталоге обновляют их содержимое. Таким образом, вышесказанное не будет работать, потому что если этот последний файл представляет собой большой файл, который может занять> 10 минут для загрузки, тогда каталог не будет действительно бездействовать (т. Е. Все файлы остаются неизменными), когда это срабатывает.

Существуют ли альтернативы на основе оболочки (в идеале это конфигурация команды find), которые используют mtime последнего измененного файла внутри как временную метку, но все же работают на уровне каталогов (т.е. мы не хотим получать несколько ударов на основе всех файлов внутри одного каталога)?

+2

Рассмотрите альтернативное решение, так как я не думаю, что вы найдете варианты, которые вы ищете (возможно, вы можете его закодировать). Если вы получаете файлы из коммерческого источника в рамках контракта, небезосновательно попросить их отправить специальный файл «flag» в качестве самого последнего файла. Затем вы можете просто зацикливаться, ища флаговый файл, и когда он придет, вы можете начать свою обработку (которая должна включать в себя этап проверки, чтобы быть уверенным, что все файлы, которые вы там есть, что они не совпадают с датами , а не пустым (если это не так), файл флага может быть списком файлов размером – shellter

+0

К сожалению, это, как правило, происходит от очень нетехнических пользователей, которые просто отбрасывают файлы в клиентский интерфейс. Мы стремимся распространять пользовательский клиент что позволило бы этот метод флага за кулисами, но нам все же хотелось бы отменить сценарии, когда пользовательское развертывание клиента не будет работать – Ramon

ответ

1

Я также на стороне «альтернативного решения» забор.

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

То, как вы справляетесь с этим, конечно, зависит от вашего FTP-сервера. У меня есть один ход vsftpd, чьи журналы включают в себя линии, как это:

Fri Mar 23 07:36:02 2012 [pid 94378] [joe] OK LOGIN: Client "10.8.7.16" 
Fri Mar 23 07:36:12 2012 [pid 94380] [joe] OK UPLOAD: Client "10.8.7.16", "/path/to/file.zip", 8395136 bytes, 845.75Kbyte/sec 
Fri Mar 23 07:36:12 2012 [pid 94380] [joe] OK CHMOD: Client "10.8.7.16", "/path/to/file.zip 644" 

UPLOAD линия только добавляется, когда Vsftpd успешно сохранен файл. Вы можете разобрать это в сценарий оболочки, как это:

#!/bin/sh 

tail -F /var/log/vsftpd.log | while read line; do 
    if echo "$line" | grep -q 'OK UPLOAD:'; then 
    filename=$(echo "$line" | cut -d, -f2) 
    if [ -s "$filename" ]; then 
     # do something with $filename 
    fi 
    fi 
done 

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

+0

с «сном 60» или 300 или 600 в нижней части цикла while, верно? ;-) Ницца! – shellter

+0

Спасибо. На самом деле, вы не захотите «спать» в нижней части цикла while, если у вас нет причин для задержки перед обработкой следующего загруженного файла. Поскольку вы используете 'tail -F', выход журнала запускает цикл только для новых записей журнала. После выполнения кода '# do something' этот скрипт будет просто ждать появления новых данных журнала. Для решения опроса потребуется задержка, но это будет [[управляемое событиями] (http://en.wikipedia.org/wiki/Event-driven_programming) * вместо опроса. – ghoti

2

Я согласен с комментарием @ shellter, что файл флага - лучший способ пойти. Это зависит от вашего пользователя, хотя согласен загрузить этот файл.

Чтобы найти самый последний файл в текущем каталоге

find . -type f -printf "%[email protected] %p\n" | sort -nr | head -1 

Выход 2 поля:

  1. время в секундах с начала эпохи, с дробными микросекунд
  2. относительный путь к файлу
+0

Спасибо, Гленн, это то, что я искал, по крайней мере, чтобы получить временное решение для работы – Ramon

Смежные вопросы