Автоматически определять, когда файл достиг предела размера

Я хотел бы отправить электронное письмо, когда файл достигнет определенного предела.

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

Тем не менее, мне кажется, что мне плохое решение добавить cronjob, который будет проверять, например, каждые 15-30 минут, размер файла?

Мне было интересно, есть ли лучший способ сделать это, чтобы автоматически обнаружить, когда в файл добавлен какой-то текст (событие?), Чтобы я мог проверить размер и сделать нужное лечение.

One Solution collect form web for “Автоматически определять, когда файл достиг предела размера”

Я могу представить себе два подхода к этому. Вы можете использовать цикл while, который будет запускать команду «stat» на некоторой заданной частоте, выполняя проверку, чтобы увидеть, превысил ли размер файла желаемый размер. Если он есть, отправьте электронное письмо. Этот метод в порядке, но может быть немного неэффективным, так как он будет запускать команду «stat» независимо от того, было ли событие в файле или нет, на заданную частоту.

Другой метод предполагает использование событий файловой системы, которые вы можете подписывать наблюдателей на использование команды inotifywatch .

Метод №1 – Пример каждого X секунд

Если вы notify.bash в скрипт следующее, скажите notify.bash :

 #!/bin/bash file="afile" maxsize=100 # 100 kilobytes while true; do actualsize=$(du -k "$file" | cut -f1) if [ $actualsize -ge $maxsize ]; then echo size is over $maxsize kilobytes .... send email .... exit else echo size is under $maxsize kilobytes fi sleep 1800 # in seconds = 30 minutes done 

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

Метод № 2 – Проверить только доступ к примеру

Более эффективным методом было бы только проверить файл, когда есть фактический доступ. Типы доступа могут различаться. В этом примере я иллюстрирую, как смотреть только файлы доступа к файлам, но вы можете смотреть только на других событиях, таких как закрываемый файл. Снова мы назовем этот файл, notify.bash :

 #!/bin/bash file=afile maxsize=100 # 100 kilobytes while inotifywait -e access "$file"; do actualsize=$(du -k "$file" | cut -f1) if [ $actualsize -ge $maxsize ]; then echo size is over $maxsize kilobytes .... send email .... exit else echo size is under $maxsize kilobytes fi done 

Запуск этого скрипта приведет к следующему выводу:

 $ ./notify.bash Setting up watches. Watches established. 

Создавая некоторую активность в файле, файл теперь сообщает о его размере следующим образом:

 $ seq 100000 > afile $ du -k afile 576 afile 

Результат нашего скрипта уведомления:

 afile ACCESS size is over 100 kilobytes 

В этот момент он выйдет.

Отправка электронной почты

Чтобы выполнить эту операцию, вы можете просто сделать что-то подобное в скрипте:

 subject="size exceeded on file $file" emailAddr="user@somedom.com" mailCmd="mail -s \"$subject\" \"$emailAddrs\"" ( echo ""; echo "DATE: $(date)"; ) | eval mail -s "$subject" \"$emailAddr\" 

Соображения

Второй способ, как он, будет работать в большинстве ситуаций. Один из них не будет, если файл уже превышает $maxsize при $maxsize сценария, и в файле access типу нет никаких дополнительных событий. Это может быть исправлено либо с дополнительной проверкой, выполняемой в скрипте при его вызове, либо путем расширения событий, на inotifywatch действует inotifywatch .

Рекомендации

  • Как выполнить команду при каждом изменении файла?
  • Как проверить размер файла?
  • Inotify-инструменты
  • Введите URL-адрес и статус HTTP-статуса
  • Как сохранить статус последнего выхода после теста
  • Как создать и выполнить скрипт bash, который вызывает исполняемый файл из более высокой папки?
  • Cygwin, bash, изменить переменную окружающей среды?
  • Как преобразовать строку в число, интерпретируемое в определенной базе в сценарии bash?
  • Обнаружение системы init с использованием оболочки
  • Перемещение подкаталога в новый родительский каталог, где новое имя каталога увеличивается на 1
  • Как читать и делать min / max / avg из потока NMEA
  • сумма всех пакетов в файлах pcap
  • Указание параметров перенаправления через переменную в команде exec
  • Почему это сравнение не равно?
  • Linux и Unix - лучшая ОС в мире.