代码之家  ›  专栏  ›  技术社区  ›  John F. Miller

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

  •  10
  • John F. Miller  · 技术社区  · 16 年前

    Ryan Tomayko用 this post 关于使用Unix进程控制命令。

    我们应该做得更多。还有很多。我说的是fork(2)、execve(2)、pipe(2)、socketpair(2)、select(2)、kill(2)、sigaction(2)等等。这些是我们的朋友。他们非常想帮助我们。

    我有一点代码(A delayed_job 克隆数据映射器,我认为这很适合,但我不清楚如何利用列出的命令。关于如何改进这个代码有什么想法吗?

    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
    
    2 回复  |  直到 8 年前
        1
  •  3
  •   Bob Aman    16 年前

    啊,是的……“我们应该做更多的这件事”的危险,而没有解释每一件事都做了什么,以及在什么情况下你会使用它们。为了一些像 delayed_job 你甚至可以用 fork 不知道你在使用 .也就是说,这真的没关系。Ryan在谈论使用 用于预处理服务器。 延迟作业 将使用 用于将进程转换为守护进程。相同的系统调用,不同的目的。运行 延迟作业 在前景中(没有 )背景中的 )将导致可忽略的性能差异。

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

    • :创建原始进程的副本
    • execve :停止执行当前文件并开始在同一进程中执行新文件(在rake任务中非常有用)
    • pipe :创建管道(两个文件描述符,一个用于读取,一个用于写入)
    • socketpair :像管子,但用于插座
    • select :让我们等待多个文件描述符中的一个或多个准备就绪并超时。
    • kill :用于向进程发送信号
    • sigaction :用于更改进程接收信号时发生的情况
        2
  •  1
  •   John F. Miller    15 年前

    5个月后,您可以在 http://github.com/antarestrader/Updater . 查看lib/updater/fork_worker.rb

    推荐文章