我正在尝试让我的 crontab 为 rails 应用程序运行一些 rake 任务,但它似乎总是以 127 的状态退出,在我的系统日志中它看起来像这样:
Jun 7 05:10:01 ip-10-170-122-226 CRON[15664]: (deploy) CMD (cd /home/deploy/apps/dashboard/current && bundle exec rake some:task
Jun 7 05:10:01 ip-10-170-122-226 CRON[15662]: (CRON) error (grandchild #15664 failed with exit status 127)
看起来 127 就像是“命令未找到错误”或者别的什么东西,所以我使用了到 bins 的完整路径,即使像 bundle 一样/usr/local/bin/bundle
,该任务在 cron 之外运行良好,只需在 shell 中运行它。
我的 crontab 非常简单:
*/10 * * * * cd /home/deploy/apps/dashboard/current && bundle exec rake some:task
也许我的 crontab 需要#!/usr/bin
或顶部的某些东西?
更新
仅测试一下,它似乎运行得很好:
*/1 * * * * /usr/bin/touch /home/deploy/cron-test.txt
所以这让我认为它就像一个 PATH 变量,但我不知道如何在其中获取正确的路径变量,有什么想法吗?
答案1
当 bash 无法找到命令时,它会设置退出状态 127(请参阅高级 Bash 脚本)。为了使调试更容易,您应该将所有内容放在脚本中。确保脚本是可执行的,并以解释器名称和路径开头:
#! /bin/bash
cd /.../ && next_command
您应该有类似以下内容的 crontab 行:
*/10 * * * * cd /home/deploy/apps/dashboard/current && /PATH_TO/bundle exec rake some:task
或者在 crontab 中设置 PATH 变量:
PATH=/bin:/usr/bin:/sbin:/usr/sbin:/PATH_TO_bundle
*/10 * * * * cd /home/deploy/apps/dashboard/current && /PATH_TO/bundle exec rake some:task
答案2
看man 5 crontab
如何为您的 cron 作业设置 PATH。
答案3
请看这里:http://ubuntuforums.org/showthread.php?t=1760488也许这会给你指明正确的方向。
通常我对 cron 作业所做的就是创建一个脚本文件,测试该脚本,然后将该脚本放入 cron 中。
希望这会有所帮助。