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, ограничения не всегда устанавливаются (в соответствии с распределением). Установите его в своем скрипте, и он будет работать.

Другие вопросы по тегам