代码之家  ›  专栏  ›  技术社区  ›  Bartek

Django:优雅地重新启动nginx+fastcgi站点以反映代码更改?

  •  1
  • Bartek  · 技术社区  · 15 年前

    常见情况:我的服务器上有一个客户机,可以更新他的Python项目中的一些代码。他可以通过ssh进入shell并从存储库中提取代码,一切都很好——但是代码存储在内存中(据我所知),所以我需要实际杀死fastcgi进程并重新启动它来更改代码。

    我知道我能 gracefully restart fcgi 但我不想手动操作。我希望我的客户机在5分钟内更新代码,让新代码在fcgi进程下运行。

    谢谢

    1 回复  |  直到 15 年前
        1
  •  1
  •   Justin Abrahms    15 年前

    首先,如果正常运行时间对你很重要,我建议让客户这样做。这可以简单到给他一个名为deploy code的命令。使用你的方法,如果他们的代码中有错误,你的方法需要10分钟的周转(读:停机)来修复它,假设他得到了正确的结果。

    也就是说,如果您真的想这样做,您应该创建一个守护进程,它将查找在过去5分钟内修改过的文件。如果检测到一个,它将执行reboot命令。

    代码可能看起来像:

    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."