bash-скрипт возвращает "нехватку памяти" в cron, но не в оболочке
Я запускаю ночной скрипт bash, чтобы синхронизировать удаленную папку (источник) с локальной папкой (цель). Я протестировал этот скрипт на основе rsync, и он отлично работает в корневой оболочке. Это требует времени, так как есть сотни концертов, но это работает.
Как только я использую его в crontab, на моем сервере заканчивается память.
Мой сервер имеет 8 ГБ ОЗУ, 4 ГБ подкачки, и, как я уже сказал, сценарий никогда не выходит из строя, когда запускается вручную из оболочки. Это стандартная установка 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
edit: конфигурация cron по умолчанию, как /etc/security/limits.conf, которая закомментирована.
2 ответа
Несмотря на то, что limit.conf закомментирован, я советую вам проверить, чтобы убедиться. Одним из способов было бы создать cronjob, который просто содержит что-то вроде "ulimit -a | Mail -s 'limit' me@example.com", чтобы информация была отправлена вам по электронной почте. Как только вы узнаете, каковы ограничения, вы можете просто сбросить их в сценарии оболочки, который фактически выполняет rsync:
#!/bin/bash
ulimit -d unlimited
ulimit -m unlimited
ulimit -s unlimited
rsync [...]
Проблема в том, что вам нужно явно настроить свои ulimits (точно так же, как рекомендует Deutsch), из-за настроек системы. Когда вы вызываете скрипт из cron, ограничения не всегда устанавливаются (в соответствии с распределением). Установите его в своем скрипте, и он будет работать.