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

Django:优雅地重新启动nginx+;fastcgi站点是否反映代码更改?,django,nginx,fastcgi,Django,Nginx,Fastcgi,常见情况:我的服务器上有一个客户机,他可能会更新python项目中的一些代码。他可以用ssh连接到shell中并从存储库中提取代码,一切都很好——但代码存储在内存中(据我所知),因此我需要实际终止fastcgi进程并重新启动它以更改代码 我知道我可以,但我不想手动这样做。我希望我的客户机更新代码,并在5分钟内或其他时间内,让新代码在fcgi进程下运行 首先谢谢,如果正常运行时间对您很重要,我建议让客户来做。这可以简单到给他一个名为deploycode的命令。使用您的方法,如果他们的代码中有错误,

常见情况:我的服务器上有一个客户机,他可能会更新python项目中的一些代码。他可以用ssh连接到shell中并从存储库中提取代码,一切都很好——但代码存储在内存中(据我所知),因此我需要实际终止fastcgi进程并重新启动它以更改代码

我知道我可以,但我不想手动这样做。我希望我的客户机更新代码,并在5分钟内或其他时间内,让新代码在fcgi进程下运行


首先谢谢,如果正常运行时间对您很重要,我建议让客户来做。这可以简单到给他一个名为deploycode的命令。使用您的方法,如果他们的代码中有错误,您的方法需要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."
导入操作系统,时间
代码_DIR='/tmp/foo'
尽管如此:
如果重新启动=真:
重新启动=错误
时间。睡眠(5*60)
对于os.walk(CODE_DIR)中的根目录、目录和文件:
如果重新启动=真:
打破
对于文件中的文件名:
如果restard=True:
打破
更新了\u on=os.path.getmtime(os.path.join(root,文件名))
当前时间=time.time()

如果首先更新当前时间,如果正常运行时间对您很重要,我建议让客户这样做。这可以简单到给他一个名为deploycode的命令。使用您的方法,如果他们的代码中有错误,您的方法需要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."
导入操作系统,时间
代码_DIR='/tmp/foo'
尽管如此:
如果重新启动=真:
重新启动=错误
时间。睡眠(5*60)
对于os.walk(CODE_DIR)中的根目录、目录和文件:
如果重新启动=真:
打破
对于文件中的文件名:
如果restard=True:
打破
更新了\u on=os.path.getmtime(os.path.join(root,文件名))
当前时间=time.time()

如果每个客户机上的current_time-updated_当前共享它们自己的进程(我使用svc和bash脚本从它们自己的dir启动manage.py runfcgi)。。我没有很多,所以这不是一个真正的问题。我如何允许他们使用部署代码脚本重新启动自己的系统?daemontool文件位于
/etc/service/
中,因此它们无权触摸这些文件,也无权使用
svc-d/-u
重新启动服务。不过,谢谢你迄今为止的帮助!我不完全确定重新启动fcgi进程需要什么。如果它类似于mod_wsgi,那么只需触摸wsgi文件(apache监视mtime)。或者,您可以授予对bash脚本的访问权,并使其更智能(以便它正确地处理用户权限)。或者,您可以重新考虑部署,允许每个应用程序有一个进程,然后他们可以随时重新启动自己的进程。不确定哪一个适合您,但上面的脚本回答了您提出的问题。每个客户端当前都共享自己的进程(我使用svc和bash脚本从自己的目录基本上启动manage.py runfcgi)。。我没有很多,所以这不是一个真正的问题。我如何允许他们使用部署代码脚本重新启动自己的系统?daemontool文件位于
/etc/service/
中,因此它们无权触摸这些文件,也无权使用
svc-d/-u
重新启动服务。不过,谢谢你迄今为止的帮助!我不完全确定重新启动fcgi进程需要什么。如果它类似于mod_wsgi,那么只需触摸wsgi文件(apache监视mtime)。或者,您可以授予对bash脚本的访问权,并使其更智能(以便它正确地处理用户权限)。或者,您可以重新考虑部署,允许每个应用程序有一个进程,然后他们可以随时重新启动自己的进程。不确定哪个适合你,但上面的脚本回答了你提出的问题。