我有一个我想在后台运行的ruby shell脚本。 但是,在进入后台之前,我需要请求用户输入。
有可能吗?如何实现?
提前致谢!
答案 0 :(得分:0)
这绝对是可能的,我的理解是非必要的功能被推送到后台工作,以减轻用户体验的一些处理负担。我现在正在沿着这些方向做某事但未被用户激活。
首先我要问一些问题:该过程是否实时提供用户反馈(对于后台工作不是一个好的用例)?一个人可以同时运行多少个工作?它将如何干扰或操作生产工人(如独角兽产卵)?如果后台作业失败会发生什么?他们处理高优先级信息吗?这些问题引导我弄清楚应该利用如何/何时监控的内容,以及我是否希望它由用户输入和启动时触发等。
无论如何,我建议使用:http://sidekiq.org/,它似乎是许多开发者中的赢家。我可能会通过接受控制器中的参数并在控制器方法中实例化worker类(如sidekiqs文档中所示)来实现它。那个worker类可能会像Runner一样运行你的ruby shell脚本吗? Runner in Ruby on Rails
您甚至可以从模型中触发它们(例如在用户创建后通过电子邮件发送)或者您有什么。
另一个经常使用的宝石是https://github.com/collectiveidea/delayed_job。在部署到生产环境时,我个人使用https://github.com/javan/whenever激活rake任务(作为cron作业)。多数民众赞成似乎与你无关。
对于这种广泛性质的未来问题,您应该提供有关工作要求的更多信息,例如回答第二段中的一些问题。你在用什么?参数是否会触发不同的脚本?您使用的是哪种导轨版本?它是用于生产还是开发?
答案 1 :(得分:0)
这是一个简单的例子:
def do_stuff(input)
puts "Input received: #{input}"
sleep 10
end
print "Enter input value: "
input = gets
pid = fork { do_stuff(input) }
puts "test.rb started, pid: #{pid}"
Process.detach pid
请注意使用fork
启动新进程,并detach
允许子进程在主进程退出时继续运行。
某些平台(Windows)不支持fork
。