2010-04-08 3 views
1

Общая ситуация: у меня есть клиент на моем сервере, который может обновить часть кода в своем проекте python. Он может ssh в свою оболочку и вытащить из своего репозитория, и все в порядке - но код хранится в памяти (насколько мне известно), поэтому мне нужно фактически убить процесс fastcgi и перезапустить его, чтобы изменить код.Django: Изящно перезапустить сайты nginx + fastcgi, чтобы отразить изменения кода?

Я знаю, что могу gracefully restart fcgi, но я не хочу, чтобы это делать вручную. Я хочу, чтобы мой клиент обновил код, и в течение 5 минут или что-то еще, чтобы новый код работал под процессом fcgi.

Благодаря

ответ

1

Во-первых, если время безотказной работы очень важно для вас, я бы предложил сделать клиенту это сделать. Это может быть так же просто, как дать ему команду под названием deploy-code. Используя ваш метод, если в коде есть ошибка, ваш метод требует 10-минутного оборота (чтение: время простоя) для его исправления, предполагая, что он правильно его понял.

Если вы действительно хотите это сделать, вы должны создать демон, который будет искать файлы, измененные за последние 5 минут. Если он обнаружит, он выполнит команду перезагрузки.

код может выглядеть примерно так:

import os, time 
CODE_DIR = '/tmp/foo' 

while True: 
    if restarted = True: 
     restarted = False 
     time.sleep(5*60) 

    for root, dirs, files in os.walk(CODE_DIR): 
     if restarted=True: 
      break 
     for filename in files: 
      if restared=True: 
       break 
      updated_on = os.path.getmtime(os.path.join(root, filename)) 
      current_time = time.time() 
      if current_time - updated_on <= 6 * 60: # 6 min 
       # 6 min could offer false negatives, but that's better 
       # than false positives 
       restarted = True 
       print "We should execute the restart command here." 
+0

Каждый клиент в настоящее время разделяет свой собственный процесс (я использую SVC и Баш скрипт в основном запустить manage.py runfcgi из своего собственного Dir) .. У меня нет многие, так что это не проблема. Как я могу позволить им перезапустить их самостоятельно, используя сценарий развертывания-кода? Файлы daemontool находятся в '/ etc/service/ /', поэтому у них нет разрешения на их использование, и у них нет разрешения использовать 'svc -d/-u' для перезапуска служб. Спасибо за помощь до сих пор! – Bartek

+0

Я не совсем уверен, что нужно для перезапуска процесса fcgi. Если он похож на mod_wsgi, вы можете просто коснуться файла wsgi (apache контролирует mtime). Кроме того, вы можете предоставить доступ к вашему сценарию bash и просто сделать его более умным (чтобы он правильно обрабатывал разрешения пользователя). Или вы можете переосмыслить свое развертывание, чтобы разрешить 1 процесс для каждого приложения, после чего они могут перезапускать свой собственный процесс так часто, как им нравится. Не уверен, что подходит для вас, но приведенный выше сценарий отвечает на заданный вами вопрос. –

Смежные вопросы