【问题标题】:Execute ruby script from cron从 cron 执行 ruby​​ 脚本
【发布时间】:2013-02-20 14:10:26
【问题描述】:

我的脚本使用 mysql、tiny_tds、fileutils 和 net/ftp。在红宝石 1.9.3 上运行。当我从文件夹内运行它时,它工作得非常好。

但是,当我将它添加到 cron 选项卡时,tiny_tds 经常失败。我不知道是否有任何其他宝石失败,因为我无法通过此错误:

require': 没有要加载的文件 -- tiny_tds (LoadError)

我尝试从 crontab 将使用的同一个 shell 执行它,但我得到了那个错误。

整个脚本只有 1 个文件。

我是 ruby​​ 新手,所以我的知识有限,无法正确设置环境。

在文件的头部我有

    #!/usr/bin/ruby
    require "mysql"
    require "fileutils";
    require "tiny_tds"  
    require "net/ftp"

简而言之,我从 mysql 中得到一个作业列表,将其与 MsSQL 进行比较,FTP 文件在作业完成后再次更新 mysql。

我需要从 cron 运行它。

经过一番研究,我尝试将宝石设置为全局,但是,我认为这可能行不通。

提前感谢您的帮助!

【问题讨论】:

  • 您找到解决方法了吗?

标签: ruby cron rvm tiny-tds


【解决方案1】:

RVM 配合 cron 有多种方式,如果你使用脚本,那么最简单的就是使用 RVM - 即不使用系统 ruby​​ #!/usr/bin/ruby - 只需在第一行输入 #!/path/to/rvm/wrappers/ruby-1.9.3-p392/ruby

您可以使用别名来防止在脚本中硬编码一个 ruby​​ 路径:

rvm alias create my_app 1.9.3

然后在脚本头(第一行):

#!/path/to/rvm/wrappers/my_app/ruby

【讨论】:

    【解决方案2】:

    这是因为当 crond 执行你的代码时,你在命令行上的环境变量没有设置。通常的嫌疑人是PATHLD_LIBRARY_PATH,以及登录时设置的别名。

    你可以看到 crond 做了什么:使用crontab -e

    * * * * *  set > /tmp/setvals
    

    创建上述条目。让它运行一段时间。返回crontab -e 并删除该新条目。

    /tmp/setvals 中的内容与您在命令行上发出set 命令时shell 提供的内容进行比较。然后,您可以采取措施为您的 cron 作业环境修改内容。

    【讨论】:

      猜你喜欢
      • 2013-10-11
      • 2017-07-18
      • 2015-08-29
      • 2023-03-06
      • 2019-10-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-01-14
      相关资源
      最近更新 更多