Использование методов управления процессом Unix в Ruby

Райан Томайко коснулся довольно сильного шторма с этот пост об использовании команд управления процессом Unix.

Мы должны делать больше этого. Это намного больше. Я говорю о fork (2), execve (2), pipe (2), socketpair (2), select (2), kill (2), sigaction (2) и т.д. И т.д. Это наши друзья. Они хотят так сильно помочь нам.

У меня есть немного кода (клон delayed_job для DataMapper, который, как мне кажется, будет соответствовать этому, но я не понимаю, как использовать перечисленные команды. Любые идеи о том, как улучшить это код?

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

Ответ 1

Ага, да... опасности "Мы должны сделать больше этого", не объясняя, что делают каждый из них и в каких обстоятельствах вы их будете использовать. Для чего-то вроде delayed_job вы даже можете использовать fork, не зная, что используете fork. Тем не менее, это действительно неважно. Райан говорил об использовании fork для предпродажных серверов. delayed_job использовал бы fork для превращения процесса в демона. Такой же системный вызов, разные цели. Выполнение delayed_job на переднем плане (без fork) и в фоновом режиме (с помощью fork) приведет к незначительной разнице в производительности.

Однако, если вы пишете сервер, который принимает параллельные соединения, теперь совет Райана стоит на деньги.

  • fork: создает копию исходного процесса
  • execve: прекращает выполнение текущего файла и начинает выполнение нового файла в том же процессе (очень полезно в задачах rake)
  • pipe: создает канал (два дескриптора файла, один для чтения, один для записи)
  • socketpair: как труба, но для сокетов
  • select: позволяет подождать, пока один или несколько из нескольких дескрипторов файлов будут готовы с таймаутом
  • kill: используется для отправки сигнала процессу
  • sigaction: позволяет вам изменять то, что происходит, когда процесс получает сигнал

Ответ 2

Через 5 месяцев вы можете просмотреть мое решение на http://github.com/antarestrader/Updater. Посмотрите на lib/updater/fork_worker.rb