【问题标题】:Ruby run two processes, output results to terminal, and end safelyRuby运行两个进程,将结果输出到终端,安全结束
【发布时间】:2011-08-20 21:53:29
【问题描述】:

在 Ruby 中,我正在运行一个系统(“command here”),它不断地观察文件的变化,类似于 tail。我希望我的程序继续运行而不是在 system() 调用时停止。 Ruby 中有没有办法创建另一个进程,这样两个进程都可以独立运行,将结果输出到终端,然后当您退出程序时,应用程序创建的所有进程都会被删除?

【问题讨论】:

  • 您想在程序退出时杀死所有子进程还是要等待子进程自行完成后再退出?
  • 程序退出时杀死所有子进程。两个进程都在监视文件的变化,所以两个进程都不会真正完成。

标签: ruby multithreading process


【解决方案1】:

只需结合spawnwaitall

spawn 'sleep 6'
spawn 'sleep 8'
Process.waitall

【讨论】:

    【解决方案2】:

    您不想使用system,因为它会等待进程完成。您可以使用 spawn 代替,然后将 wait 用于进程(以避免僵尸)。然后,当您想退出时,向您生成的进程发送一个 SIGTERM。您也可以使用fork 来启动您的子进程,但如果您使用外部程序,spawn 可能更容易。

    您也可以使用进程组而不是跟踪所有进程 ID,然后一个 Process.kill('TERM', -process_group_id) 调用就可以解决问题。您的子进程应该在同一个进程组中结束,但如果需要,可以使用 Process.setpgid

    这是一个使用 fork 的示例(这样更容易将其全部包装在一个包中)。

    def launch(id, sleep_for)
        pid = Process.fork do
            while(true)
                puts "#{id}, pgid = #{Process.getpgid(Process.pid())}, pid = #{Process.pid()}"
                sleep(sleep_for)
            end
        end
        # No zombie processes please.
        Process.wait(pid, Process::WNOHANG)
        pid
    end
    
    # These just forward the signals to the whole process group and
    # then immediately exit.
    pgid = Process.getpgid(Process.pid())
    Signal.trap('TERM') { Process.kill('TERM', -pgid); exit }
    Signal.trap('INT' ) { Process.kill('INT',  -pgid); exit }
    
    launch('a', 5)
    launch('b', 3)
    while(true)
        puts "p, pgid = #{Process.getpgid(Process.pid())}, pid = #{Process.pid()}"
        sleep 2
    end
    

    如果你在一个终端中运行它,然后从另一个终端中杀死它(使用 shell 的 kill 命令),你会看到孩子们也被杀死了。如果您删除“将此信号转发给整个进程组”Signal.trap 的东西,那么一个简单的 SIGTERM 将使子进程仍在运行。

    所有这些都假设您正在使用某种 Unixy 系统(例如 Linux 或 OSX),YMMV 其他任何地方。

    【讨论】:

      【解决方案3】:

      使用 Spawn 再投一票。我们在生产环境中经常使用它,而且非常稳定。

      【讨论】:

        猜你喜欢
        • 2014-11-19
        • 2015-03-17
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-04-08
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多