【问题标题】:How to run a ruby shell script that shows some information, then asks for input and goes background?如何运行显示一些信息的 ruby​​ shell 脚本,然后要求输入并进入后台?
【发布时间】:2015-09-11 01:03:27
【问题描述】:

我有一个要在后台运行的 ruby​​ shell 脚本。 但是,在进入后台之前,我需要询问用户输入。

有可能吗?如何实现?

提前致谢!

【问题讨论】:

标签: ruby ubuntu background-process


【解决方案1】:

这是一个简单的例子:

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

【讨论】:

    【解决方案2】:

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

    我认为您必须首先问一些问题:该流程是否实时向用户提供反馈(对于后台工作来说不是一个好的用例)?一个人可以同时运行多少个作业?它将如何干扰或影响生产工人(如 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?它是用于生产还是开发?

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-10-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-10-14
      • 2021-11-21
      相关资源
      最近更新 更多