6

我的脚本使用 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 运行它。

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

提前感谢您的帮助!

4

2 回答 2

5

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

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

* * * * *  set > /tmp/setvals

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

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

于 2013-03-05T23:47:20.713 回答
2

There are multiple ways for RVM to cooperate with cron, if you use script then the simplest is just to use RVM - which means do not use system ruby #!/usr/bin/ruby - just put in the first line #!/path/to/rvm/wrappers/ruby-1.9.3-p392/ruby

you can use aliases to prevent hardcoding one ruby path in a script:

rvm alias create my_app 1.9.3

and then in script header (first line):

#!/path/to/rvm/wrappers/my_app/ruby
于 2013-03-06T06:00:45.920 回答