【问题标题】:Cron won't execute ruby scriptCron 不会执行 ruby​​ 脚本
【发布时间】:2013-10-11 11:38:52
【问题描述】:

我设置了一个 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​​,在无法写入服务器自己的 ruby​​ 目录的情况下启动并运行 Jekyll 意味着使用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 环境中使用?我是否遗漏了语法中明显的东西?任何帮助将不胜感激。

【问题讨论】:

    标签: ruby cron crontab jekyll cron-task


    【解决方案1】:

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

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

    【讨论】:

    • 方便的链接,谢谢。不幸的是,虽然能够检查 RVM ruby​​ 的路径是否正确并调用 OK 很有用,但使用根据建议格式化的脚本似乎没有帮助。
    • Loading RVM environment files in shell scripts 下显示的方法在我的情况下完美运行(以及 crontab 文件中对 PATH 的必要添加)。
    【解决方案2】:

    在你的问题中,你正在运行的 cron 是这样的

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

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

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


    如果@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
    

    【讨论】:

    • 权限没问题,而且shebang似乎没问题。 . 是 IIRC,源的简写标记(来自记忆)。但是,在 crontab 中尝试使用完整路径(或使用@psny 的建议)仍然 不会让事情运行。我认为它一定是环境问题,因为脚本可以手动执行。 cron 不喜欢的是什么让我感到困惑。
    • @JohnR 您是否在 .bash_profile 中导出了一些与 jekyll 相关的环境变量?如果是这样,请尝试在 crontab 条目中导出它们。一旦条目工作,您可以将确切的详细信息移动到您的 shell 文件中。
    • @JohnR 关于The . was a shorthand mark for source (from memory) - 这是代表​​当前工作目录,还是别名。如果首先,您使用不正确(这就是我建议删除它的原因),如果其次,您需要在 shell 脚本中为别名运行相应的命令。此外,请注意使用&&; 分隔shell 命令。
    • 是的,我把. 拿出来并避免使用$HOME。今天早上我终于收到了一封电子邮件通知,说明使用 crontab 中的完整路径运行的 cron 作业(为什么花了这么长时间,我不知道;时间设置是正确的)。看起来它适用于完整路径,但是 Jekyll 的返回警告是由包含看起来像降价标签的内容的导入帖子引起的(非关键 - build 命令很高兴在终端中继续通过它们)。大概是 cron 绊倒了这些……
    • 所以看起来完整路径就是答案 - 我只需要在 cron 满意之前清理导入遗留的小故障。感谢大家的帮助!
    【解决方案3】:

    您可能需要使用绝对路径,因为 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 的绝对路径,并且可能在 && 之后,以便首先设置环境。

    【讨论】:

    • 正如我在下面所指出的,这看起来非常合理 - 谢谢 - 但无论我尝试哪种方式,脚本似乎都无法执行。
    猜你喜欢
    • 2013-02-20
    • 1970-01-01
    • 2014-01-07
    • 1970-01-01
    • 2019-10-30
    • 1970-01-01
    • 1970-01-01
    • 2018-02-13
    • 2020-09-18
    相关资源
    最近更新 更多