我的脚本使用mysql,tiny_tds,fileutils和net / ftp。在ruby 1.9.3上运行。当我从文件夹里面运行它时,它完全正常。
然而,当我将它添加到cron选项卡时,tiny_tds经常失败。我不知道是否有任何其他宝石失败,因为我无法通过此错误:
require':没有要加载的文件 - tiny_tds(LoadError)
我尝试从crontab使用的同一个shell执行它,我得到了那个错误。
整个脚本只有一个文件。
我是ruby的新手所以我的知识在以正确的方式设置环境方面受到限制。
在文件的头部我有
#!/usr/bin/ruby
require "mysql"
require "fileutils";
require "tiny_tds"
require "net/ftp"
简而言之,我从mysql中获取了一个Jobs列表,将其与MsSQL进行比较,将FTP文件与之相比较,并在完成作业时再次更新mysql。
我需要从cron运行它。
经过一番研究,我试图将宝石设置为全局,但是,我认为这可能没有用。
提前感谢您的帮助!
答案 0 :(得分:5)
这是因为当crond执行代码时,命令行中的环境变量不会被设置。通常的嫌疑人是PATH
,LD_LIBRARY_PATH
,以及登录时设置的别名。
你可以看到crond的作用:使用crontab -e
* * * * * set > /tmp/setvals
创建以上条目。让它运行一段时间。返回crontab -e
并删除该新条目。
将/tmp/setvals
中的内容与shell在命令行上发出set
命令时提供的内容进行比较。然后,您可以采取措施修改cron作业环境的内容。
答案 1 :(得分:2)
RVM有多种方式与cron合作,如果你使用脚本那么最简单的就是使用RVM - 这意味着不要使用系统ruby #!/usr/bin/ruby
- 只需放入第一行{{1} }
您可以使用别名来防止在脚本中对一个ruby路径进行硬编码:
#!/path/to/rvm/wrappers/ruby-1.9.3-p392/ruby
然后在脚本标题(第一行)中:
rvm alias create my_app 1.9.3