处理非常长时间的rake任务
我有兴趣运行一个非常长时间的rake任务,一个需要几个小时才能完成的任务,我有兴趣了解处理这个问题的最佳实践。
我发现可能的解决方案:
- 设置一个cron作业
- delayed_job的
- resque
cron似乎是一个简单的设置解决方案,但它是否适合长期任务? 您使用什么以及您的解决方案的优点/缺点是什么?
我个人喜欢Resque,你可以使用resque-scheduler gem处理长时间运行或定期任务。
如果您不必经常运行任务,则可以将rake任务妖魔化,以确保在SSH会话死亡时继续运行。
尝试这样的事情:
nohup rake my:task &
nohup
会将输出发送到你运行任务的目录中的nohup.out
,并且还会让你的ssh会话没有进程死亡,其次&
将把它作为deamon运行。
在我创建的一个应用程序中,用户可以上载在上传时缩略图的PDF以创建预览图像。 由于PDF可能非常大,缩略图可能需要一段时间,并且必须在后台运行。 为此,我用过
- 用于上传的回形针 ,
- delayed_paperclip gem将缩略图移交给后台进程,
- 由Redis支持的Resque ,用于处理工作队列,以及
- 神gem,推出Redis和Resque工作人员并监控整个shebang。
从好的方面来说,你可以获得漂亮的Resque GUI来查看你的工作人员,并且你有上帝在那里观察(并杀死并重新启动)失控过程(当你处理时往往会发生很多事情) ImageMagick中的PDF文件,使整个过程更加稳定可靠。
从负面来看,设置比cron工作要困难得多。 但是让cron运行一个长期的,内存密集型的进程不受监控似乎对我来说是一个灾难。
希望有所帮助!