Определить свободное место на диске и удалить файлы если мало свободного места

На самом деле это единственный раздел про unix на этом форуме

Модераторы: /dev/random, Модераторы разделов

artly
Сообщения: 4

Определить свободное место на диске и удалить файлы если мало свободного места

Сообщение artly »

Добрый день. Есть такая задача:
- Сайт находится на VPS под Debian
- Необходимо:
a) Проверять раз в 30 минут сколько осталось свободного места на ЖД.
b) Если его осталось менее заданной величины (например менее 80%), то удалить все файлы старше определенного возраста в определенной папке.
Пункт b я сделал давно запуском по крону find с параметрами, но на данный момент это решение очень не гибкое. Я тупо его запускаю раз в 12 часов. А нужно запускать когда заканчивается место на ЖД.

Сделал так

Код: Выделить всё

if [ `df|grep /dev/simfs|awk '{ print $5 }'|awk '{gsub(/%/,"")}1'`>80 ]; then find /var/www/test/cache/ -cmin +50 -type f -delete; fi


Но почему-то в любом случае начинает удалять. Сейчас 50% занято, запускаю и команда на удаление срабатывает, хотя не должна.
Подскажите пожалуйста.
Спасибо сказали:
Аватара пользователя
SLEDopit
Модератор
Сообщения: 4823
Статус: фанат консоли (=
ОС: GNU/Debian, RHEL

Re: Определить свободное место на диске и удалить файлы если мало свободного места

Сообщение SLEDopit »

artly писал(а):
27.07.2011 14:47
Сделал так
В одинарных скобках нельзя использовать > или <. Используйте -gt или -lt (в вашем случае -gt). Или используйте двойные скобки ( [[ .. ]] ).
Так же я бы не рекомендовал использовать подобную конструкцию (df | grep | awk) в данном виде, т.к. в случае переноса при длинном названии файловой системы (например /dev/mapper/data-docus) вывод df съедет и вывод будет парситься некорректно.
Я бы сделал вот так:

Код: Выделить всё

[ $(df /dev/mapper/data-docus | sed 's/.* \([0-9]\+\)%.*/\1/;$!d') -gt 80 ] && find /var/www/test/cache/ -cmin +50 -type f -delete

ps. А еще лучше настроить систему мониторинга, которая может не просто выполнять определенные действия, но и спамить на мыло, и не только на предмет пустого места.
pps. А еще я бы посмотрел в сторону настройки кэширования. Наверняка там есть какие-нибудь параметры, ограничивающие время жизни кэша и удаляющие неактуальные файлы.
ppps. В случае работы с кэшем, я бы больше беспокоился не о пустом месте на диске, а о свободных инодах. (нужно добавить опцию -i к df и все точно так же будет работать, но мониторинг будет по количеству инодов).
UNIX is basically a simple operating system, but you have to be a genius to understand the simplicity. © Dennis Ritchie
The more you believe you don't do mistakes, the more bugs are in your code.
Спасибо сказали:
Аватара пользователя
sash-kan
Администратор
Сообщения: 13939
Статус: oel ngati kameie
ОС: GNU

Re: Определить свободное место на диске и удалить файлы если мало свободного места

Сообщение sash-kan »

SLEDopit писал(а):
27.07.2011 15:35
при длинном названии файловой системы (например /dev/mapper/data-docus) вывод df съедет и вывод будет парситься некорректно.
$ df -P
и вывод будет строго однострочный·
Писать безграмотно - значит посягать на время людей, к которым мы адресуемся, а потому совершенно недопустимо в правильно организованном обществе. © Щерба Л. В., 1957
при сбоях форума см.блог
Спасибо сказали:
artly
Сообщения: 4

Re: Определить свободное место на диске и удалить файлы если мало свободного места

Сообщение artly »

Спасибо, все работает!
ps. А еще лучше настроить систему мониторинга, которая может не просто выполнять определенные действия, но и спамить на мыло, и не только на предмет пустого места.

Подскажите пожалуйста, какая мониторинга имеется в виду?
Спасибо сказали:
Аватара пользователя
SLEDopit
Модератор
Сообщения: 4823
Статус: фанат консоли (=
ОС: GNU/Debian, RHEL

Re: Определить свободное место на диске и удалить файлы если мало свободного места

Сообщение SLEDopit »

artly писал(а):
27.07.2011 18:09
Подскажите пожалуйста, какая мониторинга имеется в виду?
Да любая. munin попроще в настройке, какой-нибудь zabbix посложнее.
Можно и cacti попробовать. Тут, как говорится, на вкус и цвет товарищи разные.
UNIX is basically a simple operating system, but you have to be a genius to understand the simplicity. © Dennis Ritchie
The more you believe you don't do mistakes, the more bugs are in your code.
Спасибо сказали:
artly
Сообщения: 4

Re: Определить свободное место на диске и удалить файлы если мало свободного места

Сообщение artly »

Спасибо!
Еще один момент касаемо крона. Та строка, что вы предложили работает отлично если в консоль её закинуть, но вот прописал я её в крон и она не работает. В логах крона вижу вот такое:
Jul 28 11:15:01 имясервера crond[24152]: (root) CMD ([ $(df|grep /dev/simfs | sed 's/.* \([0-9]\+\))


То есть будто прерывается на каком-то символе. Должно было быть:
[ $(df|grep /dev/simfs | sed 's/.* \([0-9]\+\)%.*/\1/;$!d') -gt 80 ] && find /var/www/test/cache/ -cmin +50 -type f -delete

Похоже что прерывание на знаке % происходит.
Спасибо сказали:
Аватара пользователя
sash-kan
Администратор
Сообщения: 13939
Статус: oel ngati kameie
ОС: GNU

Re: Определить свободное место на диске и удалить файлы если мало свободного места

Сообщение sash-kan »

artly писал(а):
28.07.2011 11:17
Похоже что прерывание на знаке % происходит.
совершенно верно· если вы напрямую используете этот символ в файле crontab, то его нужно экранировать·
Писать безграмотно - значит посягать на время людей, к которым мы адресуемся, а потому совершенно недопустимо в правильно организованном обществе. © Щерба Л. В., 1957
при сбоях форума см.блог
Спасибо сказали:
Аватара пользователя
t.t
Бывший модератор
Сообщения: 7390
Статус: думающий о вечном
ОС: Debian, LMDE

Re: Определить свободное место на диске и удалить файлы если мало свободного места

Сообщение t.t »

SLEDopit писал(а):
27.07.2011 15:35
Я бы сделал вот так:

Код: Выделить всё

sed 's/.* \([0-9]\+\)%.*/\1/;$!d'

А я бы так:

Код: Выделить всё

egrep -o '[0-9]+%' | tr -d %


P.S. Что-то мне наш shell golf вспомнился. (:
¡иɯʎdʞ ин ʞɐʞ 'ɐнɔɐdʞǝdu qнεиж
Спасибо сказали:
Аватара пользователя
drBatty
Сообщения: 8735
Статус: GPG ID: 4DFBD1D6 дом горит, козёл не видит...
ОС: Slackware-current

Re: Определить свободное место на диске и удалить файлы если мало свободного места

Сообщение drBatty »

SLEDopit писал(а):
27.07.2011 15:35
В одинарных скобках нельзя использовать > или <.

можно.

$

doc@dt:~$ [ a \< bb ]; echo $? 0 doc@dt:~$ [ xa \< bb ]; echo $? 1


SLEDopit писал(а):
27.07.2011 15:35
Используйте -gt или -lt (в вашем случае -gt). Или используйте двойные скобки ( [[ .. ]] ).

$

doc@dt:~$ (( 17 < 6 )); echo $? 1 doc@dt:~$ (( 17 > 6 )); echo $? 0


ИМХО лучше.
artly писал(а):
27.07.2011 14:47
a) Проверять раз в 30 минут сколько осталось свободного места на ЖД.
b) Если его осталось менее заданной величины (например менее 80%), то удалить все файлы старше определенного возраста в определенной папке.
Пункт b я сделал давно запуском по крону find с параметрами, но на данный момент это решение очень не гибкое. Я тупо его запускаю раз в 12 часов. А нужно запускать когда заканчивается место на ЖД.

$ df | sed -rn 's~^/dev/sda2.* ([^%

+)%.*~\1~p'] 15


вот и всё...
sash-kan писал(а):
28.07.2011 16:14
совершенно верно· если вы напрямую используете этот символ в файле crontab, то его нужно экранировать·

проще всего вынести команду в скрипт. А в crontab'е вызывать этот скрипт. Тогда проблем точно не будет.
http://emulek.blogspot.ru/ Windows Must Die
Учебник по sed зеркало в github

Скоро придёт
Осень
Спасибо сказали: