【发布时间】:2015-09-11 01:03:27
【问题描述】:
我有一个要在后台运行的 ruby shell 脚本。 但是,在进入后台之前,我需要询问用户输入。
有可能吗?如何实现?
提前致谢!
【问题讨论】:
标签: ruby ubuntu background-process
我有一个要在后台运行的 ruby shell 脚本。 但是,在进入后台之前,我需要询问用户输入。
有可能吗?如何实现?
提前致谢!
【问题讨论】:
标签: ruby ubuntu background-process
这是一个简单的例子:
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。
【讨论】:
这绝对是可能的,我的理解是非必要的功能被推送到后台作业,以减轻用户体验的一些处理负担。我现在正在按照这些思路做一些事情,但没有被用户激活。
我认为您必须首先问一些问题:该流程是否实时向用户提供反馈(对于后台工作来说不是一个好的用例)?一个人可以同时运行多少个作业?它将如何干扰或影响生产工人(如 unicorn spawn)?如果后台作业失败会发生什么?他们是否在处理高优先级信息?这些问题引导我弄清楚如何/何时监控以及我是否希望它由用户输入触发、启动时触发等等。
无论如何,我建议使用:http://sidekiq.org/,它似乎是许多开发人员的赢家。我可能会通过接受控制器中的参数并在控制器方法中实例化工作类(如您在 sidekiqs 文档中看到的)来实现它。那个工人阶级可能会像这里的问题一样使用 Runner 运行你的 ruby shell 脚本? Runner in Ruby on Rails
您甚至可以通过模型触发它们(例如在用户创建后发送电子邮件)或您拥有什么。
另一个常用的 gem 是 https://github.com/collectiveidea/delayed_job 。在部署到生产环境时,我个人使用https://github.com/javan/whenever 来激活 rake 任务(作为 cron 作业)。不过,这似乎与您不太相关。
对于此类广泛性质的未来问题,您应该提供有关工作要求的更多信息,例如回答第二段中的一些问题。你用什么?参数是否触发不同的脚本?你用的是什么版本的rails?它是用于生产还是开发?
【讨论】: