Rails 如何通过 web 服务,触发服务器端的脚本,让脚本到后台运行?

匿名 · 2014年02月23日 · 最后由 littlell 回复于 2014年02月25日 · 4316 次阅读

如何通过 web 服务,触发服务器端的脚本,让脚本到后台运行? 并获得脚本的运行状态,即是否成功启动等信息~

一旦请求到服务端了,代码都是随便你写的,该怎么运行就怎么运行

匿名 #2 2014年02月23日

#1 楼 @yedingding 可能自己没表达清楚,就是通过 rails 的 web 服务来启动服务器端的某个脚本,是长时间处理的 job,而且有多个。 可以在 render 之前通过 system 'nohup ruby xxx.rb &'来启动吗? 还有个问题就是,不想让用户重复这样的操作,如果脚本已经在运行,如何知道?

首先一个请求到后端,用 JS 或者直接提交表单。

后端脚本运行,把运行状态写入一个文本文件。

然后前端 JS 按一定间隔不断请求服务器,读取运行状态文件并写入 DOM。

运行结束后有一个特殊记录。前端读到这个记录停止请求。

#2 楼 @littlell rails 跟这个服务器端是同一个还是不同的?job 放 sidekiq 里面,然后状态查询看你想通过什么机制,文件啊,redis 啊都可以

你可以看看 Delayed Job 或者 Resque 是否满足你的需求。

匿名 #6 2014年02月23日

#4 楼 @yedingding 同一个,就放在 rails 项目里面,按你的意思 try 下~

匿名 #7 2014年02月23日

#5 楼 @kgen 恩,试试先~

归根结底是记录 pid

return unless Process.getpgid(File.read('my.pid')) rescue nil
pid = Process.fork { sleep 100 }
File.write('my.pid', pid)
匿名 #11 2014年02月24日

#10 楼 @sg552sg552 看了下,真心不错哈·

要是不想另外起个进程也可以考虑 Sucker Punch https://github.com/brandonhilkert/sucker_punch

你可以 fork 一个进程去做这件事。可以监控子进程的返回。

匿名 #14 2014年02月25日

#9 楼 @swordray 正解,pid 放到了 Rails.root/tmp/pids 中,再启动检查下就 ok。

匿名 #15 2014年02月25日

#13 楼 @jimrokliu 如果可能起多个进程呢,如何监控子进程,有例子没、、

#15 楼 @littlell 有一本书叫理解 UNIX 进程 (英),里面有例子怎样 fork,怎样监控,怎样获得返回值。

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