Cron不会执行ruby脚本

时间:2013-10-04 12:57:44

标签: ruby cron crontab jekyll cron-task

我有一个cron作业设置为执行shell脚本,告诉服务器每小时过去2分钟运行一个ruby命令(jekyll build --source /path/to/source/dir --destination /path/to/dest/dir)。当我通过终端运行脚本时脚本执行得很好,但是cron似乎没有触发它。我知道cron的环境与用户的环境不同,我已将其源路径设置为我的.bash_profile,其中定义了用户ruby环境,根据其他地方的建议。我现在很茫然。

crontab条目如下所示:

2 * * * * . $HOME/.bash_profile ~/jek.sh

FWIW,.bash_profile的相关部分,在安装RVM时自动设置(在共享主机上,有点过时的ruby也不会少,让Jekyll启动并运行而无法写入服务器自己的ruby目录意味着使用RVM;这似乎工作得非常好),是:

PATH=$PATH:$HOME/bin

export PATH

[[ -s "$HOME/.rvm/scripts/rvm" ]] && source "$HOME/.rvm/scripts/rvm" # Load RVM into a shell session *as a function*

我是否错误地调用了我的用户配置文件以便在cron环境中使用?我在语法中遗漏了一些明显的东西吗?任何帮助将不胜感激。

3 个答案:

答案 0 :(得分:3)

您认为$HOME会在cron的环境中评估什么?

由于您使用的是rvmThis是运行cron作业的正确方法

答案 1 :(得分:1)

你可能需要使用绝对路径,因为cron可能非常挑剔。

在'crontab -e'之后试试这个:

2 * * * * /bin/bash /home/username/jek.sh

如果您想将命令串在一起,请使用&&每个之间:

2 * * * * /bin/bash /home/user_name/.bash_profile && /bin/bash /home/username/jek.sh

作为注释,除了/ bin /之外,您还可以在/ usr / bin中找到许多命令。要查找命令的绝对位置,请使用“which”。例如,:

user@computer:~$ which bash
 /bin/bash

最后,您可以使用cron直接运行ruby脚本,使用jekyll的绝对路径,并且可能在&&为了首先建立环境。

答案 2 :(得分:1)

在你的问题中,你正在运行的cron就像

2 * * * * . $HOME/.bash_profile ~/jek.sh

您需要使用此条目更正/验证多项内容

  1. 检查两者的文件权限是777还是775rwx)。如果没有,请使用chmod 777 ~/jek.sh
  2. 更改文件权限
  3. 检查他们每个人在他们的shebang行中定义他们的语言脚本(#!/usr/local/env sh
  4. &&;分隔两个脚本,以便它们都能正常运行。目前,第二个脚本的名称将被视为第一个脚本的参数。
  5. .部分之后有一个2 * * * *。我不确定你为什么要添加它 - 它必须被删除。

  6. 如果@ psny的答案不适合您,请尝试在cron条目中导出路径变量。在那之后,整个事情应该正常工作。步骤

    1)找到$PATH

    的值
    echo $PATH #Lets call the string :some/path/:another/path
    

    2)在crontab条目中手动设置路径

    2 * * * * export PATH=:some/path/:another/path && /bin/bash /home/username/jek.sh