Comments 50
Мне кажется все-таки правильнее распорядок запуска скрипта настроить в cron, а не прописывать условие в самом скрипте. А в целом наверняка кому-то будет полезно.
Даешь больше мотивов для организации бекапов!
Даешь больше мотивов для организации бекапов!
Спасибо за комментарий! Был бы очень признателен, если бы вы подсказали как это сделать. Я, лично, не знаю.
Есть команда test в консоли, она возвращает true и false:
# test $(((`date +%j` % 2))) != 0 && ls
# test $(((`date +%j` % 2))) == 0 && ls
Наверное можно прописать в крон, только 4 строки придется писать, под четные и нечетные…
# test $(((`date +%j` % 2))) != 0 && ls
# test $(((`date +%j` % 2))) == 0 && ls
Наверное можно прописать в крон, только 4 строки придется писать, под четные и нечетные…
Идея хорошая, но вот только не работает в кроне test
В консоли да, в кроне нет.
* * * * * /usr/bin/test $(((`date +%j` % 2))) == 0 && touch /root/test
В консоли да, в кроне нет.
Потому что вы пытаетесь выполнить команды шелла из обычного exec вызова. Оберните всё это в sh -c, тогда заработает.
Пример можно? Туплю, увы
Если обернуть, то както так:
5 * * * * /usr/bin/sh -c "/usr/bin/test $(((`date +%j` % 2))) != 0 && touch /root/test"
5 * * * * /usr/bin/sh -c "/usr/bin/test $(((`date +%j` % 2))) != 0 && touch /root/test"
Спасибо огромное. Буду пробовать.
Попробовал. В логах ошибка с выражением date +%j:
Т.е. как бы я не изощрялся после + команда обрывается.
Был бы благодарен за любые мысли по исправлению ошибки.
(root) CMD (/bin/sh -c "/usr/bin/test $(((`/bin/date +)
Т.е. как бы я не изощрялся после + команда обрывается.
Был бы благодарен за любые мысли по исправлению ошибки.
Первое что приходит в голову -экранировать слэшом
Эквивалентная запись без обратных апострофов(если обратные апострофы разрывают команду в двойных кавычках)
#test $((($(date +%j) % 2))) == 0 && ls
Одно и тоже:
echo $(ls) = echo `ls`
#test $((($(date +%j) % 2))) == 0 && ls
Одно и тоже:
echo $(ls) = echo `ls`
/bin/sh -c "/usr/bin/test $((($(/bin/date +%j) % 2))) == 0 && touch /var/www/alex/tessst"
тоже самое в логе: (alex) CMD (/bin/sh -c "/usr/bin/test $((($(/bin/date +)
тоже самое в логе: (alex) CMD (/bin/sh -c "/usr/bin/test $((($(/bin/date +)
Другой вариант ничего не оборачивать, а использовать bash вместо sh, тогда там не нужны кавычки.
/usr/bin/bash /usr/bin/test…
/usr/bin/bash /usr/bin/test…
/usr/bin/bash /usr/bin/test
/bin/bash — это один файл со своими командами, /usr/bin/test — совсем другой. И пробовать с помощью баша запустить test бессмысленно.
Наверное, только у меня так:
[root@serv1 ~]# printenv SHELL //смотрим переменную окружения
/bin/bash
[root@serv1 ~]# type test //входит в состав оболочки
test is a shell builtin
Вообще в кроне можно явно указать оболочку:
SHELL=/bin/bash
[root@serv1 ~]# printenv SHELL //смотрим переменную окружения
/bin/bash
[root@serv1 ~]# type test //входит в состав оболочки
test is a shell builtin
Вообще в кроне можно явно указать оболочку:
SHELL=/bin/bash
Нагуглил такой вариант без test:
# нечетные:
0 0 1-31/2 * * /path/to/script
# четные:
0 0 0-30/2 * * /path/to/script
Еще такая фишка, что если запуск скрипта .sh не от рута, то нужно прописывать имя пользователя перед командной строкой.
# нечетные:
0 0 1-31/2 * * /path/to/script
# четные:
0 0 0-30/2 * * /path/to/script
Еще такая фишка, что если запуск скрипта .sh не от рута, то нужно прописывать имя пользователя перед командной строкой.
Чуть ниже в комментах я писал:
Приведенная вами команда привязана к дню месяца и будет работать по чётным дням месяца. Т.е. если в месяце 31 день, то она отработает 30 и 2-го. Условие через день, как хочу я, нарушено.
Какая интересная задачка.
Похоже всё дело в процентах, как я уже писал, надо их экранировать:
You can not use % in the command area. They will need to be escaped and if used with command substitution like the date command you can put it in backticks. Ex. `date +\%Y-\%m-\%d`. Or use bash's command substituion $().
https://www.pantz.org/software/cron/croninfo.html
Похоже всё дело в процентах, как я уже писал, надо их экранировать:
You can not use % in the command area. They will need to be escaped and if used with command substitution like the date command you can put it in backticks. Ex. `date +\%Y-\%m-\%d`. Or use bash's command substituion $().
https://www.pantz.org/software/cron/croninfo.html
Ну, например:
вместо одной строки 00 03 * * * /bin/bash /root/rsynс.sh vet
станет несколько, по дням недели:
00 03 * * 1 /bin/bash /root/rsynс.sh vet
00 03 * * 3 /bin/bash /root/rsynс.sh vet
00 03 * * 5 /bin/bash /root/rsynс.sh vet
00 03 * * 7 /bin/bash /root/rsynс.sh vet
Пятый параметр в crontab — день недели. И не нужно никаких шаманств в самом скрипте. Пусть он выполняется всегда, если уж его запустили. Даже в плане тестирования удобнее.
Эти строки нужно сделать для каждого бэкапа (я привёл только для vet пример).
вместо одной строки 00 03 * * * /bin/bash /root/rsynс.sh vet
станет несколько, по дням недели:
00 03 * * 1 /bin/bash /root/rsynс.sh vet
00 03 * * 3 /bin/bash /root/rsynс.sh vet
00 03 * * 5 /bin/bash /root/rsynс.sh vet
00 03 * * 7 /bin/bash /root/rsynс.sh vet
Пятый параметр в crontab — день недели. И не нужно никаких шаманств в самом скрипте. Пусть он выполняется всегда, если уж его запустили. Даже в плане тестирования удобнее.
Эти строки нужно сделать для каждого бэкапа (я привёл только для vet пример).
Отлично! Спасибо большое!
Только вот как бы окончательно уточнить: отсчет дней недели точно от 1?
https://ru.wikipedia.org/wiki/Cron
А чтобы ТОЧНО выяснить и ТОЧНО запомнить, можно в крон поставить команду rf -rm /
(шутка)
* * * * * выполняемая команда
- - - - -
| | | | |
| | | | ----- День недели (0 - 7) (Воскресенье =0 или =7)
| | | ------- Месяц (1 - 12)
| | --------- День (1 - 31)
| ----------- Час (0 - 23)
------------- Минута (0 - 59)
А чтобы ТОЧНО выяснить и ТОЧНО запомнить, можно в крон поставить команду rf -rm /
(шутка)
Хорошая шутка. Оценил. Но с днями недели не всё так просто. Мне надо через день. Если отталкиваться от дней недели: 1-ый, 3-ий, 5-ый, 7-ой, 1-ый, 3-ий, 5-ый? Не получается строго через день, т.к. в неделе 7 дней
Вы можете очень гибко управлять настройками запуска cron заданий
Например:
Будет выполняться каждые 2 дня. И должно решить вашу задачу.
Больше примеров например в той же wiki на которую ссылаются чуть выше.
Например:
00 03 */2 * * /bin/bash /root/rsynс.sh vet
Будет выполняться каждые 2 дня. И должно решить вашу задачу.
Больше примеров например в той же wiki на которую ссылаются чуть выше.
Приведенная вами команда привязана к дню месяца и будет работать по чётным дням месяца. Т.е. если в месяце 31 день, то она отработает 30 и 2-го. Условие через день, как хочу я, нарушено.
00 03 * * 1 /bin/bash /root/rsynс.sh vet
00 03 * * 3 /bin/bash /root/rsynс.sh vet
00 03 * * 5 /bin/bash /root/rsynс.sh vet
00 03 * * 7 /bin/bash /root/rsynс.sh vet
А не проще вместо 4-х строчек как-то так:
00 03 * * */2 /bin/bash /root/rsynс.sh vet
Не тестил, правда, но по логике должно работать.
Я прошу прощения за оффтоп, но уж не знаю, куда обратиться.
У меня при закачке на Яндекс.Диск через WebDAV много времени занимает старт (или окончание) закачки файла. То есть, даже пустой файл (каждый) закачивается около секунды. И в Linux, и в Windows…
Хуже того, аналогичное — в браузере. При закачке 300 файлов (папкой) происходит более 700 запросов к сайту, что есть уйма времени. И в Linux, и в Windows…
Поддержка пока путное не ответила. У всех так?
У меня при закачке на Яндекс.Диск через WebDAV много времени занимает старт (или окончание) закачки файла. То есть, даже пустой файл (каждый) закачивается около секунды. И в Linux, и в Windows…
Хуже того, аналогичное — в браузере. При закачке 300 файлов (папкой) происходит более 700 запросов к сайту, что есть уйма времени. И в Linux, и в Windows…
Поддержка пока путное не ответила. У всех так?
Сочувствую. Если под разными OS лагает, то возможно проблема в провайдере интернета. Могу порекомендовать только попробовать что-либо загрузить под другим провайдером, в идеале в другой географической точке. Если проблема повторится — пинать ТП Яндекса.
Это может быть связано с DNS, провайдерами, и/или различными блокировками (от роскомнадзора, например).
Могу только предположить, что на каждую операцию происходит проверка сертификата сервера, или что-то подобное. А это могут быть несколько дополнительных DNS запросов. Тут только мониторить чем-нибудь, чтобы отловить где задержки.
Для проверки вот только запустил копировать 800 файлов, общим объёмом 20 МБ — половина уже скопировалось, за пару минут. Но долго получается, да. Проще всё в архив в один файл (разбивать по 4ГБ) и архивы отправлять.
Могу только предположить, что на каждую операцию происходит проверка сертификата сервера, или что-то подобное. А это могут быть несколько дополнительных DNS запросов. Тут только мониторить чем-нибудь, чтобы отловить где задержки.
Для проверки вот только запустил копировать 800 файлов, общим объёмом 20 МБ — половина уже скопировалось, за пару минут. Но долго получается, да. Проще всё в архив в один файл (разбивать по 4ГБ) и архивы отправлять.
Это все ведь и сайта и WebDAV касается, да? Через WebDAV, кстати, еще медленнее…
Качал через webdav. Клиент — линуксовый dolphin.
Мне кажется, лагает сама реализация WebDAV на ЯДиск. Ну как бы и логично — скорость файловых операций никто не обещал, обещали объем, а использовать ЯДиск для внешнего хранилища мелких файлов типа логов не есть то, для чего ЯДиск создавался. Может и специально тормозят.
Попробуйте закачать на ЯДиск пару-тройку сотен маленьких файлов (по килобайту или около того) в архиве, раскрыть архив и посмотреть, как они удаляются в Midnight Commander. У меня были СТРАШНЫЕ тормоза год назад, когда я забыл включить удаление одиночных time-lapse фоток с камеры наблюдения после сборки в видео. Один файл удалялся секунд 15. Как сейчас — не знаю.
Попробуйте закачать на ЯДиск пару-тройку сотен маленьких файлов (по килобайту или около того) в архиве, раскрыть архив и посмотреть, как они удаляются в Midnight Commander. У меня были СТРАШНЫЕ тормоза год назад, когда я забыл включить удаление одиночных time-lapse фоток с камеры наблюдения после сборки в видео. Один файл удалялся секунд 15. Как сейчас — не знаю.
WebDAV и duplicity решают эти проблемы гораздо проще.
И не нужно придумывать велосипеда с одним треугольным и одним квадратным колесом.
Ну и, да, не используйте su, используйте sudo.
И не нужно придумывать велосипеда с одним треугольным и одним квадратным колесом.
Ну и, да, не используйте su, используйте sudo.
По поводу duplicity: потребуется клиенту архив с данными, и он, наверное будет очень рад тому, что они зашифрованы, а админа под боком нет.
По webdav: пробовал. Показалось, что работает медленнее. Возможно неправ.
По su и sudo. Вообще работать под рутом — плохая практика. Очень плохая. Но если мне всё-таки нужен именно рут, тогда я использую su и всегда помню что под рутом. При использовании sudo — я всегда помню, что я работаю от имени пользователя с повышенными привилегиями.
По webdav: пробовал. Показалось, что работает медленнее. Возможно неправ.
По su и sudo. Вообще работать под рутом — плохая практика. Очень плохая. Но если мне всё-таки нужен именно рут, тогда я использую su и всегда помню что под рутом. При использовании sudo — я всегда помню, что я работаю от имени пользователя с повышенными привилегиями.
> По поводу duplicity: потребуется клиенту архив с данными, и он, наверное будет очень рад тому, что они зашифрованы, а админа под боком нет.
man duplicity
/--no-encryption
> По webdav: пробовал. Показалось, что работает медленнее. Возможно неправ.
apt-cache search davfs2
> По su и sudo.
Пока вы админите свой локалхост вы, конечно, можете использовать su, но когда вы начнете работать, то вам придется использовать sudo. Потому лучше послушайте человека с опытом администрирования в 20 лет и привыкайте делать правильно.
man duplicity
/--no-encryption
> По webdav: пробовал. Показалось, что работает медленнее. Возможно неправ.
apt-cache search davfs2
> По su и sudo.
Пока вы админите свой локалхост вы, конечно, можете использовать su, но когда вы начнете работать, то вам придется использовать sudo. Потому лучше послушайте человека с опытом администрирования в 20 лет и привыкайте делать правильно.
Удаление старых бэкапов нужно делать не только по времени, но и по количеству оставшихся файлов, можно остаться совсем без единого.
А письма о бэкапах зачем я себе отправляю?
Наверное, чтобы их читать, но к этому должна быть большая любовь, особенно когда их штук по 100 приходит.
Да… тогда ой. Но я всё-таки читаю, пока пью утренний кофе, т.е. в первую очередь. Не из любви к эпистолярному жанру, конечно, а для спокойствия душевного. Но и по сто писем мне не приходит. А если бы приходило, то складывал бы все письма о бэкапах в отдельный каталог, и все равно пробегал бы их глазами. Автоматизация рутинных действий дело хорошее, но и приглядывать надо.
Можно что-то типа такого использовать для удаления:
cd /mnt/backup && rm -Rf `ls -t --full-time | awk '{if (NR > 4)printf("%s ",$9);}'`
4 это количество бэкапов плюс 1
cd /mnt/backup && rm -Rf `ls -t --full-time | awk '{if (NR > 4)printf("%s ",$9);}'`
4 это количество бэкапов плюс 1
Но количество файлов нам заранее неизвестно. В статье рассмотрен один тестовый пользователь с 3-мя бэкапами. Но в др. csv файле записано i пользователей, следовательно кол-во бэкапов в папке = $i * $n (кол-во бэкапов для одного пользователя).
Как вам такой алгоритм:
в цикле считаем кол-во пользователей -> если в папке для бэкапов архивов <= чем $i * $n, то ничего не делаем, иначе удаляем, тем или иным способом, старые архивы?
Как вам такой алгоритм:
в цикле считаем кол-во пользователей -> если в папке для бэкапов архивов <= чем $i * $n, то ничего не делаем, иначе удаляем, тем или иным способом, старые архивы?
Каждый пользователь в отдельной папке, каждый бэкап в архиве, так можно.
Думать надо, хотя вроде всё и просто. У одного пользователя может быть больше одного домена. К меня так, например. Куча служебных сайтов на одном, моем пользователе. И все они в одной папке, по три копии. Раскидывать не вижу смысла.
Более того совсем не факт, что количество сайтов у отдельно взятого пользователя есть константа. Гулять может в обе стороны. Так что у себя я ничего менять не буду, и буду ориентироваться, при удалении, на время создания файлов.
Лучшее — враг хорошего
Работает? Не трогай!
Sign up to leave a comment.
Организация бэкапов на разные аккаунты Я.Диска