我有兴趣运行一个非常长的 rake 任务,可能需要数小时才能完成,我想了解处理这个问题的最佳实践。
我找到的可能解决方案:
- 设置 cron 作业
- delayed_job
- resque
cron 似乎是一个简单的设置方案,但对于非常长的任务来说是否理想?你使用什么,并且你的解决方案的优缺点是什么?
我有兴趣运行一个非常长的 rake 任务,可能需要数小时才能完成,我想了解处理这个问题的最佳实践。
我找到的可能解决方案:
cron 似乎是一个简单的设置方案,但对于非常长的任务来说是否理想?你使用什么,并且你的解决方案的优缺点是什么?
个人而言,我喜欢使用Resque,你可以使用resque-scheduler gem来处理长时间运行或定期任务。
如果你不需要经常运行任务,你可以将rake任务守护化,以确保即使SSH会话中断或其他情况发生,任务也能继续运行。
可以尝试以下方式:
nohup rake my:task &
nohup
命令会将输出发送到你运行任务的目录下的 nohup.out
文件中,并且还能够让你在离开 SSH 会话时不会导致进程终止。此外,&
符号会使其以守护进程的形式运行。
好的一面是,你可以得到漂亮的Resque GUI来查看你的工作进展,而且你还有God在那里监视(并杀死、重启)失控的进程(当你在ImageMagick中处理PDF时,这种情况很容易发生),使整个过程更加稳定可靠。
不足之处在于,它比cron job难设置得多。但是让cron运行一个长时间的、占用内存的进程而没有监控似乎对我来说是一场灾难的配方。
希望这能帮到你!