2009-11-17 10 views
0

Я использую ruby ​​1.8.7 и rails 2.3.4. Я разрабатываю плагин, поэтому у меня не слишком много свободного времени.системные и вилочные вызовы блокируют порт 3000

В моем контроллере мне нужно вызвать задачу грабли. Задача рейка займет больше времени, чтобы закончить, так что я после подхода, упомянутого в Railscast, который

system "rake #{task} &" 

Это решение отлично работает и все нормально. Я знаю, что это решение не будет работать на Windows, и я в порядке.

Я запустил свой сервер в порту 3000. Был вызван контроллер, который запустил задачу рейка в фоновом режиме. Однако, если я ctrl + c мой скрипт/сервер, и если я попытаюсь перезапустить сервер, тогда я получу эту ошибку.

Адрес уже используется - связывания (2) (Errno :: EADDRINUSE)

Затем я изменил код, чтобы сделать это

fork do 
system "rake #{task} &" 
end 

все тот же вопрос.

Кто-нибудь, как мне обойти эту проблему с портом 3000, блокируется. Также поможет любое объяснение того, почему задача рейка блокирует порт 3000.

ответ

3

От ruby-docs:

Kernel.fork [{блок}] => Fixnum или ноль

Process.fork [{блок}] => Fixnum или ноль

Создает подпроцесс. Если задан блок , этот блок выполняется в подпроцессе , а подпроцесс завершается со статусом нуля. В противном случае вызов fork возвращает дважды, один раз в родительском, возвращает идентификатор процесса дочернего элемента и один раз у ребенка, возвращая нуль. Ребенок процесс может выйти с помощью Kernel.exit! до избегать запуска любых функций at_exit. Родительский процесс должен использовать Process.wait для сбора статусов завершения своих детей или использовать Process.detach для регистрации незаинтересованности в их статусе; В противном случае операционная система может накапливать процессы зомби.

Виток, вызывающий поток, является единственной нитью в созданном дочернем процессе. fork не копирует другие потоки. Окончательное решение на основе комментариев:

command = "rake #{task} #{args.join(' ')}" 
p1 = Process.fork { system(command) } 
Process.detach(p1) 
+0

Не работает. Пересмотренные код p1 = вилка {система (команда)} Process.detach (p1) все еще получаю адрес уже используется –

+0

Просто, чтобы убедиться, что не осталось свободных концов, вы могли бы изменить вилку Process.fork? –

+0

та же проблема с Process.fork тоже. –