системные и разветвленные вызовы блокируют порт 3000 - PullRequest
0 голосов
/ 17 ноября 2009

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

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

system "rake #{task} &"

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

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

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

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

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

Все та же проблема.

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

1 Ответ

3 голосов
/ 17 ноября 2009

С ruby-docs :

Kernel.fork [{block}] => fixnum или nil

Process.fork [{block}] => fixnum или nil

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

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

command = "rake #{task} #{args.join(' ')}" 
p1 = Process.fork { system(command) } 
Process.detach(p1)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...