我管理的一个 Ubuntu 10.10 网络服务器遇到了一个非常奇怪的问题。
我使用 ruby 和 rake 编写了一个脚本来运行一些 tar 命令并对数据库进行 mysqldump。我在 root 用户 crontab 中安装了一个条目,如下所示:
0 0,12 * * * /bin/bash -l -c 'cd /my/script/path && rake backup:everything'
这在一台服务器上运行良好。然而在另一台服务器上,这似乎并没有真正执行我的脚本中的内容。
我知道这肯定会被叫停,因为当我跑的时候
grep CRON /var/log/syslog
它返回:
Mar 22 12:00:01 ServerName CRON[10273]: (root) CMD (/bin/bash -l -c 'cd /my/script/path && rake backup:everything')
但它肯定没有执行脚本中所述的操作。
当我直接运行这样的脚本时:
cd /my/script/path && sudo rake backup:everything
它运行完美。
我也在两台服务器的 crontab 中执行了此操作:
0 0,12 * * * /bin/bash -l -c 'cd /my/script/path && rake backup:everything >> output.txt'
(就像我在脚本中时不时地做的“把‘备份 x 文件夹’放进去”)
在 cron 作业运行的服务器上,它会创建 output.txt 文件并将预期输出放入其中,如“开始备份”等。
然而,在服务器上,它无法正常工作,它只会创建文件,但文件会留空。但是,当我再次从 syslog 复制命令并手动运行它时:
sudo /bin/bash -l -c 'cd /my/script/path && rake backup:everything >> output.txt'
它运行良好并且输出符合预期。
我现在可能是在无奈,但这可能与此有关:
CRON[10271]: (root) MAIL (mailed 55 bytes of output but got status 0x004b#012)
这出现在系统日志中每一个cron 调用。我实际上只有这个 cron 作业和另一个用于更新系统时钟的小作业,但从外观上看,它们都没有正常工作。
错误的邮件配置会终止我的 cron 任务吗?有可能吗?
答案1
您应该在 cron 行中提供 rake 的完整路径。例如:
/sbin/rake
或者它实际居住的任何地方。
如果 rake 所在的路径不在您的根用户路径中,它将无法运行。
如果是邮件,您应该会在邮件日志中看到一些内容。检查一下。
答案2
处理 cron 时,请务必考虑环境变量。最好运行导入环境变量 (source) 的 bash 脚本并运行命令。