У меня есть архитектура мастеров-рабочих, где число работников растет еженедельно. Я больше не могу ожидать ssh или удаленной консоли на каждой машине, чтобы убить работника, выполнить синхронизацию с исходным кодом и перезапустить. Я хотел бы, чтобы мастер мог разместить в сети сообщение, в котором каждая машина должна синхронизироваться и перезагружаться.
Вот где я наткнулся на контрольно-пропускной пункт. Если бы я использовал любую нормальную платформу, я мог бы просто сделать:
exec('ruby', __FILE__)
... и будет сделано. Тем не менее, я сделал следующий тест:
p Process.pid
sleep 1
exec('ruby', __FILE__)
... и в Windows я получаю один экземпляр ruby для каждого вызова exec. Никто из них не умрет, пока я не нажму ^ C в рассматриваемом окне. На каждой платформе, на которой я это пробовал, она каждый раз запускает новую версию файла, что я проверил, внеся простые изменения в сценарий теста, пока тест шел.
Причина, по которой я печатаю pid, состоит в том, чтобы перепроверить поведение, которое я вижу. В Windows я получаю разные pid с каждым выполнением - что и следовало ожидать, учитывая, что я вижу новый процесс в диспетчере задач для каждого запуска. Mac ведет себя правильно: pid одинаков для всех системных вызовов, и я с помощью dtrace проверил, что каждый запуск запускает вызов системного вызова execve.
Итак, вкратце, есть ли способ заставить скрипт Windows Ruby перезапустить его выполнение, чтобы он выполнял любой код - включая его самого - который изменился во время его выполнения? Обратите внимание, что это не приложение rails, хотя оно использует activerecord.