在Ruby中使用Unix进程控制方法

Joh*_*ler 10 ruby unix fork process-control

Ryan Tomayko用这篇关于使用Unix进程控制命令的文章引发了一场火灾风暴.

我们应该做更多这方面的事情.更多这一点.我在谈论fork(2),execve(2),pipe(2),socketpair(2),select(2),kill(2),sigaction(2)等等.这些是我们的朋友.他们非常想要帮助我们.

我有一些代码(delayed_jobDataMapper的一个克隆,我认为它适合这个,但我不清楚如何利用列出的命令.有关如何改进此代码的任何想法?

def start
  say "*** Starting job worker #{@name}"
  t = Thread.new do
    loop do
      delay = Update.work_off(self)
      break if $exit
      sleep delay
      break if $exit
    end
    clear_locks
  end

  trap('TERM') { terminate_with t }
  trap('INT')  { terminate_with t }

  trap('USR1') do
    say "Wakeup Signal Caught"
    t.run
  end
end
Run Code Online (Sandbox Code Playgroud)

Bob*_*man 3

啊,是的......“我们应该做更多这样的事情”而不解释它们各自的作用以及在什么情况下使用它们的危险。对于像您这样的东西,您甚至可能在不知道自己正在使用的情况下delayed_job使用。话虽这么说,其实这并不重要。Ryan 正在谈论用于预分叉服务器。 将用于将进程转变为守护进程。相同的系统调用,不同的目的。在前台运行(不带)与在后台运行(带)的性能差异可以忽略不计。forkforkforkdelayed_jobforkdelayed_jobforkfork

然而,如果您编写一个接受并发连接的服务器,那么现在 Ryan 的建议是正确的。

  • fork:创建原始进程的副本
  • execve:停止执行当前文件并开始在同一进程中执行新文件(在 rake 任务中非常有用)
  • pipe:创建一个管道(两个文件描述符,一个用于读取,一个用于写入)
  • socketpair:像管道一样,但用于套接字
  • select:让您等待一个或多个多个文件描述符准备好并超时
  • kill:用于向进程发送信号
  • sigaction:让您可以更改进程收到信号时发生的情况