Может ли автономный скрипт Ruby (Windows и Mac) перезагрузить и перезагрузить себя? - PullRequest
2 голосов
/ 14 апреля 2010

У меня есть архитектура мастеров-рабочих, где число работников растет еженедельно. Я больше не могу ожидать 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.

Ответы [ 2 ]

2 голосов
/ 17 апреля 2010

Перепробовав ряд решений (в том числе предложенных Байроном Уитлоком, которые в итоге поставили меня на путь к удовлетворительному концу), я остановился на:

IO.popen("start cmd /C ruby.exe #{$0} #{ARGV.join(' ')}")
sleep 5

Я обнаружил, что если я вообще не сплю после «попенса» и просто ухожу, спавн часто (> 50% времени) терпит неудачу. Очевидно, это не кроссплатформенность, поэтому для того же поведения на Mac:

IO.popen("xterm -e \"ruby blah blah blah\"&")
0 голосов
/ 14 апреля 2010

Классический способ перезапустить программу - написать другую, которая сделает это за вас.таким образом, вы порождаете процесс до restart.exe <args>, затем умираете или выходите;restart.exe ждет, пока вызывающий скрипт больше не будет запущен, затем снова запускает скрипт.

...