2010-03-23 10 views
37

Piszę skrypt ładowania ruby ​​dla projektu szkolnego, a część tego procesu ładowania rozpoczyna się kilka procesów w tle (które są napisane i działają poprawnie). Co chciałbym zrobić coś na wzór:Spawn proces tła w Ruby

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

jednak, że bloki na pierwsze wezwanie do wykonania daemon1. Widziałem odniesienia do metody Process.spawn, ale wydaje się, że jest to funkcja 1.9+, a ja jestem ograniczony do Ruby 1.8.

Próbowałem również wykonać te demony z różnych wątków, ale chciałbym, aby mój skrypt bootstrap mógł wyjść.

Jak mogę uruchomić te procesy działające w tle, aby mój skrypt startowy nie blokował i mógł wyjść (ale nadal działają demony w tle)?

Odpowiedz

63

Dopóki pracujesz na systemie POSIX, możesz użyć fork i exec.

fork = Utwórz podproces

exec = Wymień bieżącego procesu z innym procesem

Następnie należy poinformować, że głównego proces nie jest zainteresowany w tworzonych przez Process.detach podprocesów.

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

Process.detach(job1) 

... 
+0

Jeśli szukasz czegoś większego (ale wciąż na tym samym hoście), rozważ daemon_controller. http://blog.phusion.nl/2008/08/25/daemon_controller-a-library-for-robust-daemon-management/ – Levi

+1

Idealny! Wiedziałem o 'fork' i' exec' (pochodzącym z tła C), ale brakowało mi 'Process.detach()'. Dzięki! –

+0

To nie działa zgodnie z oczekiwaniami, na OSX Lion i wstępnie zainstalowany rubin. – nes1983

0

Cóż, technicznie rzecz biorąc, można dosłownie:

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

Ale nie zrobi tego, co chcesz to zrobić, oczywiście.

Jednak może też po prostu przejść & jako argument do system (i przyjaciół), a jej tło zadanie.

0

lepszy sposób pseudo-deamonize:

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

spadnie proces w jego własnej skorupie.

najlepszym sposobem faktycznie daemonize:

`service daemon1 start` 

i upewnić się, że serwer/użytkownik ma uprawnienia do rozpoczęcia rzeczywistego demona. sprawdź narzędzie "deamonize" dla systemu Linux, aby skonfigurować swojego demona.