我正在运行一个夜间 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 调用脚本时,限制并不总是会设置(根据发行版)。在您的脚本中设置它,它就会起作用。