【问题标题】:Spawn a background process in Ruby在 Ruby 中生成一个后台进程
【发布时间】:2011-01-31 01:24:37
【问题描述】:

我正在为一个学校项目编写一个 ruby​​ 引导脚本,这个引导过程的一部分是启动几个后台进程(它们已编写并正常运行)。我想做的事情是这样的:

`/path/to/daemon1 &`
`/path/to/daemon2 &`
`/path/to/daemon3 &`

但是,这会在第一次调用执行 daemon1 时阻塞。我见过对 Process.spawn 方法的引用,但这似乎是 1.9+ 的功能,而且我仅限于 Ruby 1.8。

我也尝试过从不同的线程执行这些守护进程,但我希望我的引导脚本能够退出。

那么我该如何启动这些后台进程,以便我的引导脚本不会阻塞并且可以退出(但仍然有后台运行的守护进程)?

【问题讨论】:

    标签: ruby background-process


    【解决方案1】:

    只要您使用的是 POSIX 操作系统,您就可以使用 fork 和 exec。

    fork = 创建一个子进程

    exec = 用另一个进程替换当前进程

    然后您需要通过Process.detach 通知您的主进程对创建的子进程不感兴趣。

    job1 = fork do
      exec "/path/to/daemon01"
    end
    
    Process.detach(job1)
    
    ...
    

    【讨论】:

    • 如果您正在寻找更大的东西(但仍在同一主机上),请考虑使用 daemon_controller。 blog.phusion.nl/2008/08/25/…
    • 完美!我知道fork 和exec(来自C 背景),但我缺少的是Process.detach()。谢谢!
    • 对我来说,这在 OSX Lion 和预装的 ruby​​ 上无法正常工作。
    • 根据文档,它不应该工作。分离并不意味着您的子进程将不再是子进程。你想要的是“守护”它。
    • @nes1983 我从未声称detach 会这样做。我假设您在这里谈论的是真正的守护进程 - 然后,是的,分离(以及整个这个问题)不是您想要的。
    【解决方案2】:

    更好的伪去魔化方法:

    `((/path/to/deamon1 &)&)` 
    

    会将进程放到它自己的 shell 中。

    真正守护进程的最佳方式:

    `service daemon1 start`
    

    并确保服务器/用户有权启动实际的守护程序。查看用于 linux 的“deamonize”工具来设置你的守护进程。

    【讨论】:

      猜你喜欢
      • 2011-04-19
      • 2013-07-28
      • 1970-01-01
      • 2021-07-26
      • 2014-04-21
      • 2011-08-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多