fork(2)
«разбивает» процесс, называя его на два независимых процесса, второй потомок первого. В родительском процессе (исходный процесс) он возвращает PID дочернего процесса. В дочернем процессе fork()
возвращает 0
.
Таким образом, в вашем примере цикл прерывается только в дочернем процессе, а в родительском процессе продолжается порождение остальных философов.
Цикл выполняется N - 1
раз, порождая N - 1
детей-философов. После завершения цикла родительский процесс также вызывает philosopher(i)
, выполняя N
-й и последний философ.
Можно явно сказать mongrel_cluster рецептам удалять изодромные с предварением файлы перед запуском путем добавления следующего в capistrano рецептах:
# helps keep mongrel pid files clean
set :mongrel_clean, true
Это заставляет это передавать - чистая опция к mongrel_cluster_ctl.
Я возвратился и посмотрел на один из своих рецептов развертывания и заметил, что также изменил способ, которым работала моя задача перезапуска. Смотрите на следующее сообщение в группе пользователей полукровки:
пользовательское обсуждение полукровки перезапуска
Следующее является моей deploy:restart задачей. Я признаю, что это - определенный взлом.
namespace :deploy do
desc "Restart the Mongrel processes on the app server."
task :restart, :roles => :app do
mongrel.cluster.stop
sleep 2.5
mongrel.cluster.start
end
end
Так или иначе мои полукровки запускают, прежде чем предыдущая команда остановки закончила закрывать их всех вниз.
сон 2.5 не является хорошим решением, если занимает больше времени, чем 2,5 секунды остановить всех рабочих полукровок.
Кажется, существует потребность в:
stop && start
по сравнению с.
stop; start
(это - то, как удар работает, && ожидает первой команды для окончания w/o ошибки, в то время как""; просто выполняет следующую команду).
Интересно, существует ли a:
wait cluster_stop
then cluster_start
Хорошее обсуждение: http://www.ruby-forum.com/topic/139734#745030
Во-первых, сузьте объем какой Ваше тестирование, только звоня cap deploy:restart
. Вы могли бы хотеть передать --debug
опция запросить перед удаленным выполнением или --dry-run
опция только для наблюдения, что продолжается, поскольку Вы настраиваете свои настройки.
На первый взгляд это походит на проблему полномочий об изодромных с предварением файлах или процессах полукровки, но трудно знать наверняка. Пара вещей, которые привлекают мое внимание:
:runner
переменная является набором explicity к nil
- Была ли определенная причина этого?:admin_runner
переменная. Не видя весь рецепт, это возможно связано с Вашей проблемой? :runner по сравнению с: admin_runner (от выпуска capistrano 2.4) Некоторые шапочники отметили что наличие deploy:setup и deploy:cleanup, выполненный как: пользователь бегуна испортил их тщательно созданные полномочия. Я согласился, что это было проблемой. С этим выпуском, deploy:start, deploy:stop, и deploy:restart все продолжают использовать: пользователь бегуна, когда sudoing, но deploy:setup и deploy:cleanup будут использовать: пользователь admin_runner.: переменная admin_runner сброшена, по умолчанию, означая, что те задачи будут sudo как корень, но если Вы хотите, чтобы они работали как: бегун, просто “установите: admin_runner, бегун”.
Моя рекомендация для того, что сделать затем. Вручную остановите полукровок и очистите PIDs. Запустите полукровок вручную. Затем, продолжите работать cap deploy:restart
при отладке проблемы. Повторитесь по мере необходимости.
Я очень не хочу быть настолько основным, но это кажется, что изодромные с предварением файлы все еще бродят вокруг, когда это пытается запуститься. Удостоверьтесь, что полукровка останавливается вручную. Очистите изодромные с предварением файлы вручную. Затем сделайте ограничение развертывается.