Я запускаю ночной сценарий bash для синхронизации удаленной папки (источника) с локальной папкой (целью). Я тестировал этот сценарий, основанный на rsync, и он отлично работает в корневой оболочке. Чтобы скопировать сотни концертов, нужно время, но это работает.
Как только я использую его в crontab, моему серверу не хватает памяти.
У моего сервера 8 ГБ ОЗУ, 4 ГБ подкачки, и, как я уже сказал, скрипт никогда не запускается из командной строки в OOM. Это установка Centos 5.5 по умолчанию. Я мог бы разделить загрузку и синхронизировать все каталоги 2-го уровня в скрипте find / for, но я бы хотел, чтобы это было просто и синхронизировать только каталоги верхнего уровня.
Я не могу проводить слишком много тестов, поскольку этот сервер используется для размещения веб-сайтов и других служб, и я не могу позволить себе повесить его только для целей тестирования. Знаете ли вы, какой параметр позволяет cron нормально завершить эту работу?
#!/bin/bash
BACKUP_PATH="/root/scripts/backup"
rsync -av --delete /net/hostname/source/ /export/target/ > $BACKUP_PATH/backup_results_ok 2> $BACKUP_PATH/backup_results_error
изменить: конфигурация cron по умолчанию, как /etc/security/limits.conf, которая все закомментирована.
Несмотря на то, что limits.conf закомментирован, я предлагаю вам протестировать его, чтобы убедиться. Один из способов - создать задание cron, которое просто содержит что-то вроде «ulimit -a | Mail -s 'limits' me@example.com», чтобы информация отправлялась вам по электронной почте. Как только вы узнаете, каковы ограничения, вы можете просто сбросить их в сценарии оболочки, который фактически запускает rsync:
#!/bin/bash
ulimit -d unlimited
ulimit -m unlimited
ulimit -s unlimited
rsync [...]
Проблема в том, что вам нужно явно установить свои ulimit (как рекомендует Deutsch) из-за системных настроек. Когда вы вызываете скрипт из cron, ограничения не всегда устанавливаются (согласно раздаче). Установите его в своем скрипте, и он будет работать.