分享 crontab 执行 ruby 脚本

tiseheaini · 2013年03月23日 · 最后由 assyer 回复于 2015年05月24日 · 8131 次阅读

最近在折腾使用服务器发微博的功能,这个功能实在是太折腾人了,开始的时候使用最通俗的方式,用 OAuth 去认证,然后再去发微博,不知道怎么的,OAuth 已经不被支持,只支持 OAuth 2.

需要在服务器端发微博,每个小时去更新一次微博,还要读取数据库,加上一些逻辑判断。

这些需求可以用 rails 去实现,可是不能够定时去执行,需要使用 linux 的 crontab 功能。

记得很久以前用过一次,是用任务备份数据库的资料,现在已经忘记了。

凭着印象去使用 crontab,开始的时候总是不能够执行命令。开始时怀疑是自己用错了。

*  *  * * * sudo  echo 'hello world!' >> /home/deploy/text.txt
tail -f /home/deploy/text.txt

用这两条命令去调试,发现没错。

后来才知道,很多细节的地方不知道。

首先 crontab 任务列表里面路径要写全,好像 ~/text.txt 是不支持的。

命令行里直接 ruby ~/xxx.rb 就可以了 可是在 crontab 列表里面就不行,要写出 ruby 的完整路径。

使用 which ruby 查出 ruby 的完整路径。

推荐给大家的方法就是写一个脚本文件,然后用 crontab 定时执行这个脚本文件。

写一个脚本文件可以方便的去执行这些任务。

这是 crontab 任务列表的样式,然后写一个 sh 脚本文件。

*  *  * * * root  /bin/bash /home/deploy/weibo.sh

这是脚本文件的样式

#!/usr/bin/
/home/deploy/.rvm/rubies/ruby-1.9.3-p385/bin/ruby /home/deploy/weibo.rb

脚本文件中不要忘了写上 #!/usr/bin/ 这行来加载环境变量

有人说还要 source ~/.bashrc 去重写加载 bash 脚本,不够我测试的时候没有这一行也没有问题,不过可能是 ubuntu 的系统没问题,其他的系统就不知道了

weibo.rb 文件就是普通的 rb 脚本文件,ruquire 一些库,然后执行一些程序。

crontab 还是有很多坑的,希望大家注意。 参考 http://ruby-china.org/topics/1448 我的点点 http://tiseheaini.diandian.com/post/2013-03-23/40048177810

whenever -i

#3 楼 @SharpX 如果项目中只有用到 active_record 我还需要安装 rails,岂不是太重了

#4 楼 @tiseheaini 这东西跟 Rails 绑定了?

#5 楼 @SharpX 没有试过,我的评论有点不合格。不过,我感觉向这类功能还是手写 crontab 比较好。 在 linux 上面工作,自己写一些脚本,是新手的必学课程,等到任务量太大了以后再去使用 whenever 来减少工作量。 这个过程还是走一遍比较好,不能,知其然而不知其所以然。

crontab 对新手很多坑,环境变量、路径问题等等,用 whenever 节约生命吧,和 rails 没关系

其实就是个 ruby 路径问题而已,用 rvm 自带的脚本载入一下就行了,手动写的话更新 ruby 版本还得重新改路径,我是这样干的:

#!/bin/bash PATH=$PATH:$HOME/.rvm/bin # Add RVM to PATH for scripting [[ -s "$HOME/.rvm/scripts/rvm" ]] && source "$HOME/.rvm/scripts/rvm" PATH=$HOME/bin:$PATH

~/script/crontab/encrypt_backup -s ~/projects -t ~/Dropbox/backup.tar.gz.enc -e ~/secret/secret

#7 楼 @qhwa 没有体验过 whenever 就评论,很冒失。

#9 楼 @tiseheaini 当年也是这些坑一个个趟过来的,你总结得挺好的 有一段时间会写 crontab 时特别小心,一步一步测试,每天运行一次的脚本,也要先设置成每分钟运行,看看有没有效果。其实精力是没必要浪费在这上面的

态度很谦虚,不过遇到问题最好不要匆忙下结论:坑多

#10 楼 @qhwa #11 楼 @SharpX 原来写 php 特别费劲,每条 sql 都要自己写,后来知道了 ORM,可是,如果没有之前的基础,后面学的东西特费劲,所以,一点点写,享受躺坑的过程吧!

我之前用 crontab 遇到的最大的坑就是 rvm 的路径...然后也是图省事写成脚本了...

#13 楼 @flypiggys 使用 which ruby 就可以知道 ruby 命令完整的路径信息

需要 登录 后方可回复, 如果你还没有账号请 注册新账号