处理长时间运行的rake任务

15

我有兴趣运行一个非常长的 rake 任务,可能需要数小时才能完成,我想了解处理这个问题的最佳实践。

我找到的可能解决方案:

  1. 设置 cron 作业
  2. delayed_job
  3. resque

cron 似乎是一个简单的设置方案,但对于非常长的任务来说是否理想?你使用什么,并且你的解决方案的优缺点是什么?

2个回答

33

个人而言,我喜欢使用Resque,你可以使用resque-scheduler gem来处理长时间运行或定期任务。

如果你不需要经常运行任务,你可以将rake任务守护化,以确保即使SSH会话中断或其他情况发生,任务也能继续运行。

可以尝试以下方式:

nohup rake my:task &

nohup 命令会将输出发送到你运行任务的目录下的 nohup.out 文件中,并且还能够让你在离开 SSH 会话时不会导致进程终止。此外,& 符号会使其以守护进程的形式运行。


这看起来完全符合我的需求。在接受之前,我将保持此问题开放一段时间以听取其他人的观点。谢谢! - JZ.
没问题!我希望你能找到你要寻找的解决方案!一旦你找到了解决方案,请发表您的解决方案! - JP Silvashy

1
在我创建的一个应用程序中,用户可以上传PDF文件,并在上传时生成缩略图以创建预览图像。由于PDF文件可能非常大,生成缩略图可能需要一段时间,并且必须在后台运行。为此,我使用了:
  • Paperclip 进行上传,
  • delayed_paperclip gem 将缩略图处理交给后台进程,
  • Resque,由Redis支持,来处理工作队列,以及
  • God gem 来启动 Redis 和 Resque 工作者并监视整个过程。

好的一面是,你可以得到漂亮的Resque GUI来查看你的工作进展,而且你还有God在那里监视(并杀死、重启)失控的进程(当你在ImageMagick中处理PDF时,这种情况很容易发生),使整个过程更加稳定可靠。

不足之处在于,它比cron job难设置得多。但是让cron运行一个长时间的、占用内存的进程而没有监控似乎对我来说是一场灾难的配方。

希望这能帮到你!


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接