Назад | Перейти на главную страницу

скрипт bash возвращает сообщение «недостаточно памяти» в cron, но не в оболочке

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