10

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
4

2 回答 2

3

啊,是的......“我们应该做更多这样的事情”的危险,而不解释每个人的作用以及在什么情况下你会使用它们。对于像delayed_job您甚至可能在fork不知道自己正在使用的情况下使用fork. 这么说,真的无所谓。Ryan 正在谈论fork用于预分叉服务器。 delayed_jobfork用于将进程变成守护进程。相同的系统调用,不同的目的。delayed_job在前台(不带fork)与在后台(带)运行fork将导致可忽略不计的性能差异。

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

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

5 个月后,您可以在http://github.com/antarestrader/Updater查看我的解决方案。查看 lib/updater/fork_worker.rb

于 2010-03-28T01:22:05.207 回答