Pull to refresh

Comments 50

Мне кажется все-таки правильнее распорядок запуска скрипта настроить в cron, а не прописывать условие в самом скрипте. А в целом наверняка кому-то будет полезно.
Даешь больше мотивов для организации бекапов!
Спасибо за комментарий! Был бы очень признателен, если бы вы подсказали как это сделать. Я, лично, не знаю.
Есть команда test в консоли, она возвращает true и false:

# 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"
Попробовал. В логах ошибка с выражением date +%j:
(root) CMD (/bin/sh -c "/usr/bin/test $(((`/bin/date +)

Т.е. как бы я не изощрялся после + команда обрывается.
Был бы благодарен за любые мысли по исправлению ошибки.
Первое что приходит в голову -экранировать слэшом
Эквивалентная запись без обратных апострофов(если обратные апострофы разрывают команду в двойных кавычках)

#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 +)
Другой вариант ничего не оборачивать, а использовать bash вместо sh, тогда там не нужны кавычки.

/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
Нагуглил такой вариант без test:

# нечетные:
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
Ну, например:
вместо одной строки 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
* * * * * выполняемая команда
- - - - -
| | | | |
| | | | ----- День недели (0 - 7) (Воскресенье =0 или =7)
| | | ------- Месяц (1 - 12)
| | --------- День (1 - 31)
| ----------- Час (0 - 23)
------------- Минута (0 - 59)



А чтобы ТОЧНО выяснить и ТОЧНО запомнить, можно в крон поставить команду rf -rm /
(шутка)
Хорошая шутка. Оценил. Но с днями недели не всё так просто. Мне надо через день. Если отталкиваться от дней недели: 1-ый, 3-ий, 5-ый, 7-ой, 1-ый, 3-ий, 5-ый? Не получается строго через день, т.к. в неделе 7 дней
Вы можете очень гибко управлять настройками запуска cron заданий
Например:
00 03 */2 * * /bin/bash /root/rsynс.sh vet

Будет выполняться каждые 2 дня. И должно решить вашу задачу.
Больше примеров например в той же wiki на которую ссылаются чуть выше.
Приведенная вами команда привязана к дню месяца и будет работать по чётным дням месяца. Т.е. если в месяце 31 день, то она отработает 30 и 2-го. Условие через день, как хочу я, нарушено.
Спасибо огромное за ссылку. Но пользователей несколько, бэкапов тоже несколько. И разносить их задания по минутам не комильфо.

Т.е для пользователя А я запускаю крон в 0 часов, для B — в 2 часа ночи, для C в 4 часа утра и т.д.

И всё это должно работать через день.
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…

Поддержка пока путное не ответила. У всех так?
Сочувствую. Если под разными OS лагает, то возможно проблема в провайдере интернета. Могу порекомендовать только попробовать что-либо загрузить под другим провайдером, в идеале в другой географической точке. Если проблема повторится — пинать ТП Яндекса.
Спасибо за ответ! Нет, смена МГТС на Yota ничего не дает. Правда, я еще не пробовал менять аккаунт…
Это может быть связано с DNS, провайдерами, и/или различными блокировками (от роскомнадзора, например).
Могу только предположить, что на каждую операцию происходит проверка сертификата сервера, или что-то подобное. А это могут быть несколько дополнительных DNS запросов. Тут только мониторить чем-нибудь, чтобы отловить где задержки.
Для проверки вот только запустил копировать 800 файлов, общим объёмом 20 МБ — половина уже скопировалось, за пару минут. Но долго получается, да. Проще всё в архив в один файл (разбивать по 4ГБ) и архивы отправлять.
Это все ведь и сайта и WebDAV касается, да? Через WebDAV, кстати, еще медленнее…
Качал через webdav. Клиент — линуксовый dolphin.
Мне кажется, лагает сама реализация WebDAV на ЯДиск. Ну как бы и логично — скорость файловых операций никто не обещал, обещали объем, а использовать ЯДиск для внешнего хранилища мелких файлов типа логов не есть то, для чего ЯДиск создавался. Может и специально тормозят.
Попробуйте закачать на ЯДиск пару-тройку сотен маленьких файлов (по килобайту или около того) в архиве, раскрыть архив и посмотреть, как они удаляются в Midnight Commander. У меня были СТРАШНЫЕ тормоза год назад, когда я забыл включить удаление одиночных time-lapse фоток с камеры наблюдения после сборки в видео. Один файл удалялся секунд 15. Как сейчас — не знаю.
UFO landed and left these words here
Спасибо буду думать. Контрольные суммы архивов лишними не будут.
WebDAV и duplicity решают эти проблемы гораздо проще.
И не нужно придумывать велосипеда с одним треугольным и одним квадратным колесом.

Ну и, да, не используйте su, используйте sudo.
По поводу duplicity: потребуется клиенту архив с данными, и он, наверное будет очень рад тому, что они зашифрованы, а админа под боком нет.

По webdav: пробовал. Показалось, что работает медленнее. Возможно неправ.

По su и sudo. Вообще работать под рутом — плохая практика. Очень плохая. Но если мне всё-таки нужен именно рут, тогда я использую su и всегда помню что под рутом. При использовании sudo — я всегда помню, что я работаю от имени пользователя с повышенными привилегиями.
> По поводу duplicity: потребуется клиенту архив с данными, и он, наверное будет очень рад тому, что они зашифрованы, а админа под боком нет.

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
Но количество файлов нам заранее неизвестно. В статье рассмотрен один тестовый пользователь с 3-мя бэкапами. Но в др. csv файле записано i пользователей, следовательно кол-во бэкапов в папке = $i * $n (кол-во бэкапов для одного пользователя).

Как вам такой алгоритм:
в цикле считаем кол-во пользователей -> если в папке для бэкапов архивов <= чем $i * $n, то ничего не делаем, иначе удаляем, тем или иным способом, старые архивы?

Каждый пользователь в отдельной папке, каждый бэкап в архиве, так можно.
Думать надо, хотя вроде всё и просто. У одного пользователя может быть больше одного домена. К меня так, например. Куча служебных сайтов на одном, моем пользователе. И все они в одной папке, по три копии. Раскидывать не вижу смысла.
Более того совсем не факт, что количество сайтов у отдельно взятого пользователя есть константа. Гулять может в обе стороны. Так что у себя я ничего менять не буду, и буду ориентироваться, при удалении, на время создания файлов.
Лучшее — враг хорошего
Работает? Не трогай!
Sign up to leave a comment.

Articles