Итак, дано — полные бэкапы аплоадятся в папку "full" каждые три часа. Базы Mysql — в папку "mysql" каждые полчаса. Так хозяину сайта хочется, он под это дело Dropbox Pro оплатил.
Надо — удалить все старые полные архивы, оставив по одному за день (а чтоб был!), и все бэкапы Mysql, кроме сегодняшних.
Предупрежу сразу — CentOS я пользуюсь недавно, меньше года. Установлен он на виртуалке в качестве тестового веб-сервера (LAMP), в консоли бываю от силы раз в месяц, а «батники» писал еще под старый добрый MS-DOS 6.22, потому всё нижеописанное родилось буквально за пару часов «с нуля» и не блещет изяществом.
Первым делом я озадачился вопросом — чем же достучаться до Dropbox из консоли? После непродолжительного поиска в интернетах обнаружился чудный bash-скрипт Dropbox_Uploader, который, как оказалось, умеет не только закачивать, но и другие жизненно необходимые команды, включая list и delete. Вот только незадача — я так и не понял сходу, обучен ли он удалять «по списку», потому оформил банально циклом (к тому же «поштучно» проще отладить).
Устанавливается dropbox_uploader просто — скачиваем его командой
curl "https://raw.githubusercontent.com/andreafabrizi/Dropbox-Uploader/master/dropbox_uploader.sh" -o dropbox_uploader.sh
даём всем права на чтение и исполнение
chmod +rx dropbox_uploader.sh
затем запускаем
./dropbox_uploader.sh
настраиваем доступ в Dropbox, следуя подсказкам на экране (создать на сайте Dropbox новое приложение и скормить скрипту APP key и APP secret) и переносим скрипт в /usr/bin/, чтобы он был доступен всем, а главное — крону.
Dropbox_uploder по команде list full (напомню, "full" у меня — имя папки) выдаёт примерно следующее
> Listing "/full"... DONE
[F] 1218610223 site-sitename.com-20150908-000001.jpa
[F] 1218610223 site-sitename.com-20150908-030001.jpa
[F] 1218610223 site-sitename.com-20150908-060001.jpa
[F] 1218610223 site-sitename.com-20150908-090001.jpa
[F] 1218610223 site-sitename.com-20150908-120001.jpa
[F] 1218610223 site-sitename.com-20150908-150001.jpa
[F] 1218610223 site-sitename.com-20150908-180001.jpa
[F] 1218610223 site-sitename.com-20150908-210001.jpa
... и т.п. ...
[F] 1218610223 site-sitename.com-20150915-150001.jpa
[F] 1218610223 site-sitename.com-20150915-180001.jpa
[F] 1218610223 site-sitename.com-20150915-210001.jpa
Cоздаем свой собственный скрипт clean_dropbox.sh сразу в /usr/bin (почему бы и нет?), c теми же правами 755, а в нём:
1. Формируем список ненужных архивов
dropbox_uploader.sh list full *.jpa | cut -d ' ' -f4 | grep -v $(date +%Y%m%d) | grep -v -e '-00' | grep -v 'full' > todel.txt
в котором полученный список файлов *.jpa из папки full фильтруется cut и несколькими grep и сохраняется в файл.
Cut оставляет только имена файлов (-d ' ' — разделитель пробел, -f4 — 4-е поле). Да-да, четвертое, т.к. строка начинается с пробела.
Первым grep отбрасываются сегодняшние архивы, второй исключает созданные в течение часа после полуночи, а третий убирает строку с названием самой папки "/full"… из начала списка.
2. Полученный файл считываем в переменную (массив строк)
files=$(<todel.txt)
3. Циклом проходимся по массиву и удаляем каждый файл
for file in $files
do
dropbox_uploader.sh delete /full/"$file" >> /var/log/cleanup.log
done
Учитывая, что скрипт будет работать в кроне, на всякий случай пишем вывод в лог-файл.
На этом обработку полных архивов можно считать завершенной, остались архивы mysql.
Тут всё по накатанной колее. Cписок файлов с упрощённым grep — нам вообще не нужны старые бэкапы, а стопку за сутки можно и потерпеть, благо их размеры вполне приемлемы.
dropbox_uploader.sh list mysql *.sql | cut -d ' ' -f4 | grep -v $(date +%Y%m%d) | grep -v 'mysql' > todel.txt
Аналогично удаляем ненужные в цикле
dropbox_uploader.sh delete /mysql/"$file" >> /var/log/cleanup.log
и напоследок убираем
rm todel.txt
Вот собственно и всё, теперь достаточно создать крон вида
50 23 * * * clean_dropbox.sh
Вуаля!
Понимаю, что для гуру Linux мой пост практически бесполезен, но Хабр читают и такие неучи, как я. Надеюсь, кому-нибудь, да пригодится.
Комментарии (13)
feedborg
17.09.2015 01:13+2По сути у вас куча костылей для элементарной задачи.
У dropbox есть cli версия, которая все хорошо синхронизирует, а удаление старых файлов — это один вызов find.
Надеюсь, платят вам не за время работы)HeadR
17.09.2015 01:32+1По поводу кучи костылей — мне нужно было найти решение, и я его нашел, бесплатно, быстро и всего 40 кб.
Если я правильно понимаю, cli это просто консольный клиент и делать find предполагается локально? Мне не нужно ничего синхронизировать (VPS не резиновый и бэкапы на нём не хранятся), только удалить устаревшее из облака.
И — нет, я обычно не работаю почасово.feedborg
17.09.2015 15:37Судя по тому, что бекап делается каждые 3 часа, а mysql каждые полчаса и это ничему не мешает — размеры там действительно скромные. Вот вроде XXI век на дворе, а вы как были в своих батниках со старым добрым MS-DOS 6.22, так и остались.
HeadR
17.09.2015 15:48Бэкап делается средствами Akeeba Backup Pro актуальной версии, купленной клиентом, Моей вины в том, что сие чудо не умеет убирать за собой на Dropbox, нет.
FractalizeR
17.09.2015 09:46+2Надеюсь, платят вам не за время работы)
Прошу прощения, но мне кажется, что подобная ирония по отношению к коллегам неуместна. Даже если автор статьи сделал что-то неправильно или не самым оптимальным путем, мы все когда-то начинали, и подобное высокомерие звучит как минимум странно.HeadR
17.09.2015 13:04-1Спасибо за поддержку. И — я писал это не для тех, кто минусует дизайнера полиграфии за bash-скрипты из снобизма. :)
feedborg
17.09.2015 15:29Можете объяснить, зачем дизайнер полиграфии пишет посты в блог «Системное администрирование»? Чтобы другие дизайнеры полиграфии, также занятые не своим делом, прочитали и сделалли все неправильно?
HeadR
17.09.2015 15:47+1Могу. У меня есть хобби, которое кроме прочего, приносит мне материальные выгоды. Я стремлюсь развиваться и считаю, что для этого необходимо не только курить маны, но и общаться с людьми, которые в этом разбираются. Здесь они есть, и если Вы один из них — вместо того, чтобы указывать людям их место, подскажите, как правильно. Заранее спасибо.
kabal375
18.09.2015 11:24Если стремитесь развиваться, стоит менее остро реагировать на замечания и больше задумываться о причинах, их вызвавших.
«Подскажите, как правильно» — не тот настрой, который способствует саморазвитию.HeadR
18.09.2015 11:30Ок. Будьте добры, укажите мне, в каком из комментов мне было задано направление поиска для саморазвития? Кроме упоминания консольного клиента, который не подходит, я конструктива пока не увидел.
HeadR
26.09.2015 17:31И никто из уважаемых комментаторов не сказал, почему этот скрипт будет работать в shell, но не будет работать в cron. Зато «не так свистишь, не так сидишь, низко летаешь». Печально. Я уже разобрался, но из вредности апдейт не напишу. Так вот.
saboteur_kiev
А зачем вы два раза формируете два разных списка файлов на удаление?
Формируйте двумя скриптами, удаляйте одним.
не совсем понял, зачем «второй исключает созданные в течение часа после полуночи»
HeadR
Первоначально делал скрипт только под полные бэкапы. Мысль была, но тогда нужно в файле хранить и имена папок, а как его вписать в каждую строку «на лету» при формировании списка — не нашел.
Да и, как по мне — два отдельных цикла понятнее и надёжнее.
Задача — оставить по одному бэкапу за каждый день.