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

Unknow user · February 23, 2014 · Last by littlell replied at February 25, 2014 · 4317 hits

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

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

Unknow user #2 February 23, 2014

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

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

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

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

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

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

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

Unknow user #6 February 23, 2014

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

Unknow user #7 February 23, 2014

#5 楼 @kgen 恩,试试先~

Unknow user #8 February 23, 2014

归根结底是记录 pid

return unless Process.getpgid(File.read('my.pid')) rescue nil
pid = Process.fork { sleep 100 }
File.write('my.pid', pid)
Unknow user #11 February 24, 2014

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

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

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

Unknow user #14 February 25, 2014

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

Unknow user #15 February 25, 2014

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

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

Unknow user #17 February 25, 2014

#16 楼 @jimrokliu ok,谢

You need to Sign in before reply, if you don't have an account, please Sign up first.