bash 脚本在 cron 中返回“内存不足”,但在 shell 中没有返回

bash 脚本在 cron 中返回“内存不足”,但在 shell 中没有返回

我正在运行一个夜间 bash 脚本来同步远程文件夹(源)和本地文件夹(目标)。我已经测试了这个基于 rsync 的脚本,它在 root shell 中运行良好。由于要复制数百个 gigs,因此需要花费一些时间,但它确实有效。

一旦我在 crontab 中使用它,我的服务器就会内存不足。

我的服务器有 8GB 的​​ RAM 和 4GB 的交换空间,而且正如我所说,当从 shell 手动运行时,脚本永远不会出现 OOM。这是默认的 Centos 5.5 安装。我可以在 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,全部被注释掉。

答案1

尽管 limits.conf 已被注释掉,我还是建议您进行测试以确保万无一失。一种方法是创建一个 cronjob,其中包含类似“ulimit -a | Mail -s 'limits'[电子邮件保护]“以便通过电子邮件将信息发送给您。一旦您知道限制是什么,您就可以在实际运行 rsync 的 shell 脚本中重置它们:

#!/bin/bash
ulimit -d unlimited
ulimit -m unlimited
ulimit -s unlimited
rsync [...]

答案2

问题是您需要明确设置 ulimits(就像 Deutsch 推荐的那样),因为系统设置。当您从 cron 调用脚本时,限制并不总是会设置(根据发行版)。在您的脚本中设置它,它就会起作用。

相关内容