Исходный пост, написанный Джин Паном 22 января 2015 г.

В Argo мы используем Go для многих наших производственных услуг. Избалованный быстрым компилятором Go, я хотел избежать механического цикла go install <alt-tab> <ctrl-c> <ctrl-p> <alt-tab>.

Мы исследовали несколько релоадеров для Go, таких как джин Codegangsta и изящный перезапуск Scalingo. gin от Codegangsta непрерывно и рекурсивно опрашивает исходный каталог сервера, ищет любые изменения в исходных файлах Go и принудительно перезапускает сервер. Изящный загрузчик Scalingo требует некоторых изменений в базовом исходном коде, чтобы он мог волшебным образом перезагрузить сервер, не вызывая сбоев в выполнении каких-либо запросов.

Ни один из релоадеров, похоже, не делал именно то, что мы хотели — сервер должен перезагружаться только тогда, когда я явно запускаю компиляцию, а не всякий раз, когда я сохраняю исходный файл в середине более крупного изменения. Обычно мне нравится магия, но перезагрузка Scalingo кажется слишком инвазивной и волшебной для того места, где мы находимся — я хочу, чтобы это была дополнительная перезагрузка, чтобы перезагрузка не влияла на производственные службы и не требовала от других разработчиков Argo принятия моего рабочего процесса.

К дизайну

В принципе такой релоадер должен быть невероятно простым:

binary_changed:
  kill old server
  start new server
when server binary is recreated, call `binary_changed`

На практике создать такой загрузчик также довольно просто, и однажды днем ​​я реализовал кросс-платформенный загрузчик на Python. Сейчас мы обсудим конкретную реализацию перезагрузки и закончим открытым исходным кодом в конце.

Мы создаем вспомогательную функцию для создания нового процесса и возврата его id. Эта функция разветвляется для создания нового дочернего процесса, запускает предоставленный исполняемый файл в родительском процессе, а дочерний ответвление возвращает идентификатор родительского процесса. Мы сохраняем этот идентификатор процесса, чтобы убить исполняемый файл, чтобы мы могли создать его новый экземпляр.

Для просмотра двоичного файла мы используем watchdog, который является кросс-платформенной оболочкой для Linuxinotify, OSX fswatch и Windows FileSystemWatcher. Эти системные вызовы легко позволяют нам регистрировать функции обратного вызова при определенных событиях файловой системы, таких как создание, удаление, изменение, перемещение и т. д. на практике означает практически мгновенный процесс перезарядки.

Для многих наших исполняемых служб у нас есть espeak или say симпатичное сообщение о запуске, которое является обнадеживающим уведомлением об успешном выполнении перезагрузки.

Мы открыли исходный код нашего сценария перезагрузки для исполняемых файлов под лицензией MIT на Github.

Первоначально опубликовано на argo.io 22 января 2015 г.