2010-03-23 1 views
37

Я пишу сценарий начальной загрузки ruby ​​для школьного проекта, и часть этого процесса начальной загрузки состоит в том, чтобы запустить пару фоновых процессов (которые написаны и работают правильно). То, что я хотел бы сделать, это что-то вроде:Создайте фоновый процесс в Ruby

`/path/to/daemon1 &` 
`/path/to/daemon2 &` 
`/path/to/daemon3 &` 

Однако этот блок блокируется при первом вызове для выполнения daemon1. Я видел ссылки на метод Process.spawn, но это похоже на 1.9+, и я ограничен Ruby 1.8.

Я также пытался выполнить эти демоны из разных потоков, но я бы хотел, чтобы мой сценарий начальной загрузки мог выйти.

Итак, как я могу запустить эти фоновые процессы, чтобы мой сценарий начальной загрузки не блокировал и не мог выйти (но все еще есть демоны, работающие в фоновом режиме)?

ответ

63

Пока вы работаете над ОС POSIX, вы можете использовать fork и exec.

fork = Создать подпроцесс

exec = Заменить текущий процесс с другим процессом

Затем вам нужно сообщить, что ваш главный-процесс не заинтересован в созданных подпроцессах через Process.detach.

job1 = fork do 
    exec "/path/to/daemon01" 
end 

Process.detach(job1) 

... 
+0

Если вы ищете что-то большее (но все-таки на том же хосте), рассмотрите daemon_controller. http://blog.phusion.nl/2008/08/25/daemon_controller-a-library-for-robust-daemon-management/ – Levi

+1

Отлично! Я знал о 'fork' и' exec' (исходит из C-фона), но это был 'Process.detach()', который я отсутствовал. Благодаря! –

+0

Это не работает, как и ожидалось, для меня, на OSX Lion и предварительно установленном рубине. – nes1983

0

Ну, технически говоря, вы можете, буквально:

`/path/to/daemon1 &` 
`/path/to/daemon2 &` 
`/path/to/daemon3 &` 

Но это не будет делать то, что вы хотите сделать, это очевидно.

Однако, вы можете также просто передать & в качестве аргумента system (и друзей), и это будет фон работу.

0

лучший способ псевдо-deamonize:

`((/path/to/deamon1 &)&)` 

прервет процесс в его собственной оболочки.

лучший способ на самом деле демон:

`service daemon1 start` 

и убедитесь, что сервер/пользователь имеет разрешения на запуск фактического демона. проверьте инструмент deamonize для linux, чтобы настроить ваш деамон.