如何在 Ruby 中启动后台进程?

Posted

技术标签:

【中文标题】如何在 Ruby 中启动后台进程?【英文标题】:How do I start a background process in Ruby? 【发布时间】:2011-08-03 07:42:30 【问题描述】:

我在 Ruby 中启动后台进程时遇到了一些困难。

我现在有这个代码。

#!/usr/bin/env ruby -w
require "daemons"
require 'rubygems'

path = "#File.expand_path(File.dirname(__FILE__))/.."

Daemons.run_proc('stalker',
  :dir_mode => :normal,
  :dir => "#path/tmp/pids",
  :backtrace => true,
  :monitor => false,
  :log_output => true
) do
  system "stalk #path/config/jobs.rb"
end

然后我使用script/stalker start 启动脚本。

问题是我无法阻止它。它将错误的 PID 保存到 pid 文件中。

像这样:

script/stalker start
=> stalker: process with pid **39756** started.

ps aux | grep ruby 
=> linus    **39781**   0,3  1,9  2522752  78864   ??  S     8:39pm   0:10.11 ruby stalk script/../config/jobs.rb

为什么第一个 pid 与使用 ps aux | grep ruby 打印的不匹配?

我尝试过使用exec%x 和这个system 来运行脚本。

【问题讨论】:

【参考方案1】:

如果你使用run_proc,你想要守护的代码应该放在块中。用system 启动另一个进程没有意义(它将fork 进程(给你另一个pid),然后exec 你的jobs.rb 脚本。要么将代码从jobs.rb 移动到@ 987654327@ 屏蔽,或使用Daemons.run

【讨论】:

以上是关于如何在 Ruby 中启动后台进程?的主要内容,如果未能解决你的问题,请参考以下文章

linux系统下如何从后台启动进程?

如何获取后台进程的进程ID?

我如何制作一个启动Python脚本的linux后台进程(在c中)

Django:在后台线程中启动一个进程?

如何使用 perl 和 Net::OpenSSH 在远程机器上启动后台进程?

如何在 linux 系统上用 PHP 启动后台进程并将用户 ajax 输入重复写入其标准输入