Как я могу контролировать для новых файлов в каталоге и отбросить почту, если файлы не добавляются каждые 30 минут?

Я запускаю Ubuntu 14.04, и я хочу контролировать папку и отбросить почту, если новые файлы не добавляются каждые 30 минут.

Я относился ниже также.

Как я могу контролировать новые файлы в каталоге и переместиться/переименовать их в другой каталог?

Я не уверен, как ожидать в течение периода и проверки на новые файлы в папке.

4
задан 8 July 2019 в 01:19

4 ответа

Вы смогли делать что-то столь же простое как:

#!/bin/bash
targetDir="$1"
while true; do
  files=("$targetDir"/*)
  sleep 30m ## wait 30 minutes
  files1=("$targetDir/"*)
  if [[ ${#files[@]} == ${#files1[@]} ]]; then
     echo "No new files added" | mail user@example.com
  fi
done

Сохраните тот сценарий как ~/bin/watch.sh или независимо от того, что Вам нравится, сделайте это исполняемым файлом (chmod a+x ~/bin/watch.sh) и выполненный это дающий его целевой каталог как аргумент:

watch.sh /path/to/dir

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

#!/bin/bash
targetDir="$1"
newest=0;

while true; do
  ## Wait for half an hour. This is done at the beginning of the loop
  ## to ensure we wait a half hour before the first check
  sleep 30m
  ## Get the current time in seconds since the epoch
  now=$(date '+%s')
  for file in "$targetDir"/*; do
    ## Get the file's modification time in seconds since the epoch
    lastMod=$(stat -c "%Y" "$file")
    ## Is this file newer than the current newest?
    if [[ $lastMod -gt $newest ]]; then
      newest=$lastMod
    fi
  done
  ## If the newest file is older than half an hour
  if [[ $((now - newest)) -gt 1800 ]]; then
    echo "No new files added since $(date -d '- 30 min')" |
      mail user@example.com
  fi
done

Если Вы не хотите запускать скрипт навсегда как этот, Вы могли бы вместо этого записать тот, который проверяет метки времени, и называйте сценарий каждые 30 минут:

#!/bin/bash
targetDir="$1"
newest=0;

for file in "$targetDir"/*; do
  ## Get the file's modification time in seconds since the epoch
  lastMod=$(stat -c "%Y" "$file")
  ## Is this file newer than the current newest?
  if [[ $lastMod -gt $newest ]]; then
    newest=$lastMod
  fi
done
## Get the current time in seconds since the epoch
now=$(date '+%s')
## If the newest file is older than half an hour
if [[ $((now - newest)) -gt 1800 ]]; then
    echo "No new files added since $(date -d '- 30 min')" |
     mail user@example.com
fi

Теперь, сохраните это как ~/bin/watch.sh и сделайте это исполняемым файлом (chmod a+x ~/bin/watch.sh). Затем выполненный crontab -e и добавьте эту строку:

*/30 * * * * /home/techie/bin/watch.sh

Сохраните файл (сохранение добавляет crontab), и Вы сделаны. Скрипт будет запускаться каждые 30 минут.

8
ответ дан 23 November 2019 в 11:40

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

$ stat $PWD
  File: ‘/home/paulm/SCRATCH’
  Size: 6144        Blocks: 8          IO Block: 32768  directory
Device: 26h/38d Inode: 10937103831396301849  Links: 6
Access: (0775/drwxrwxr-x)  Uid: (  520/   paulm)   Gid: ( 1020/   paulm)
Access: 2019-07-09 13:17:15.528000000 +0000
Modify: 2019-07-09 13:17:15.528000000 +0000
Change: 2019-07-09 13:17:15.528000000 +0000
 Birth: -

$ touch bar

$ stat $PWD
  File: ‘/home/paulm/SCRATCH’
  Size: 6144        Blocks: 8          IO Block: 32768  directory
Device: 26h/38d Inode: 10937103831396301849  Links: 6
Access: (0775/drwxrwxr-x)  Uid: (  520/   paulm)   Gid: ( 1020/   paulm)
Access: 2019-07-09 13:23:11.346000000 +0000
Modify: 2019-07-09 13:23:11.346000000 +0000
Change: 2019-07-09 13:23:11.346000000 +0000
 Birth: -

если дата на изменениях каталога, то стоит искать новые файлы, это должно быть намного более эффективно.

2
ответ дан 23 November 2019 в 11:40

Ответы до сих пор предполагают, что файлы только входят в каталог и никогда не выходят. Но что, если у Вас есть сценарий, который периодически освобождает каталог? Затем сценарий мог пропустить факт, файл вошел в каталог 5 несколько минут назад, но был обработан и вынут.

Другая опция использует inotifywait команда, записанная на высокоэффективном языке C в специальных целях контролировать файл и создание каталога и модификацию. Можно установить его с командой:

sudo apt install inotify-tools

Psuedo-код для соответствующего сценария был бы:

  • Ожидайте 30 минут или пока каталог не изменится
  • Каталог изменялся?
  • Да? Мы добрались здесь потому что измененный каталог. Цикл назад и ожидает 30 минут снова.
  • Нет? Мы добрались здесь, потому что истекли 30 минут. Пошлите электронное письмо и цикл назад для ожидания 30 минут снова.

Вы назвали бы сценарий от места как /etc/rc.local таким образом, это работает, когда машина загружается.

Преимущество этой методологии - Вы, не проверяют каталог каждые 30 минут, а скорее Вы проверяете его спустя 30 минут после последних изменений в каталоге.

2
ответ дан 23 November 2019 в 11:40

Существует изящная утилита для точно этой задачи:

https://bitbucket.org/eradman/entr/src/default/

0
ответ дан 23 November 2019 в 11:40

Другие вопросы по тегам:

Похожие вопросы: