如何 运行 ruby shell 脚本显示一些信息,然后要求输入并进入后台?

How to run a ruby shell script that shows some information, then asks for input and goes background?

我有一个 ruby shell 脚本,我想 运行 在后台运行。 但是,在进入后台之前,我需要请求用户输入。

可能吗?如何实现?

提前致谢!

绝对有可能,我的理解是将非必要的功能推送到后台作业,以减轻用户体验的一些处理负担。我现在正在按照这些思路做一些事情,但没有被用户激活。

我想你必须先问一些问题:这个过程是否实时给用户反馈(不是后台工作的好用例)?一个人可以同时担任 运行 多少份工作?它将如何干扰或操作生产工人(如 unicorn spawn)?如果后台作业失败会怎样?他们正在处理高优先级信息吗?这些问题引导我弄清楚利用什么 how/when 来监控,以及我是否希望它由用户输入触发、启动时触发、等等。

无论如何,我建议使用:http://sidekiq.org/ , It seems to be winner amongst a lot of developers. I would probably implement it by accepting the parameters in the controller and instantiating the worker class (as you can see in sidekiqs documentation) inside a controller method. That worker class will run your ruby shell script probably with Runner like the question here? Runner in Ruby on Rails

您甚至可以通过模型触发它们(例如在创建用户后发送电子邮件)或您有什么办法。

另一个经常使用的 gem 是 https://github.com/collectiveidea/delayed_job . I am personally using https://github.com/javan/whenever 用于在部署到生产环境时激活 rake 任务(作为 cron 作业)。不过那似乎与你不太相关。

对于这种广泛性质的未来问题,您应该提供更多关于工作要求的信息,例如回答第二段中的一些问题。你有什么用?参数是否触发不同的脚本?您使用的 rails 版本是什么?它是用于生产还是开发?

这是一个简单的例子:

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