2010-04-08 4 views
1

Situation courante: J'ai un client sur mon serveur qui peut mettre à jour une partie du code dans son projet python. Il peut ssh dans son shell et sortir de son dépôt et tout va bien - mais le code est stocké en mémoire (autant que je sache) donc j'ai besoin de tuer le processus fastcgi et le redémarrer pour que le code change.Django: Redémarrez avec élégance les sites nginx + fastcgi pour refléter les changements de code?

Je sais que je peux gracefully restart fcgi mais je ne veux pas avoir à faire manuellement ce. Je veux que mon client mette à jour le code, et dans les 5 minutes ou peu importe, pour que le nouveau code fonctionne sous le processus fcgi.

Merci

Répondre

1

Tout d'abord, si le temps de fonctionnement est important pour vous, je vous suggère de faire le client le faire. Cela peut être aussi simple que de lui donner une commande appelée code de déploiement. En utilisant votre méthode, s'il y a une erreur dans votre code, votre méthode nécessite un délai d'exécution de 10 minutes (lire: temps d'arrêt) pour le réparer, en supposant qu'il l'ait correctement.

Cela dit, si vous voulez vraiment faire cela, vous devez créer un démon qui va rechercher les fichiers modifiés au cours des 5 dernières minutes. S'il en détecte un, il exécutera la commande reboot.

code pourrait ressembler à:

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

Chaque client partage actuellement son propre processus (je l'utilise et svc un script bash pour lancer essentiellement runfcgi manage.py de leur propre répertoire) .. Je n'ai pas beaucoup, donc ce n'est pas vraiment un problème. Comment puis-je leur permettre de redémarrer le leur en utilisant un script de code de déploiement? Les fichiers daemontool sont dans '/ etc/services/ /' ils n'ont la permission de toucher ceux-ci, ils ne sont autorisés à utiliser '-d svc/-u' pour redémarrer les services. Merci pour l'aide jusqu'à présent, cependant! – Bartek

+0

Je ne suis pas entièrement sûr de ce qu'il faut pour redémarrer un processus fcgi. Si c'est similaire à mod_wsgi, vous pouvez simplement toucher le fichier wsgi (apache surveille le mtime). Alternativement, vous pouvez accorder l'accès à votre script bash et le rendre plus intelligent (pour qu'il gère correctement les permissions des utilisateurs). Vous pouvez également repenser votre déploiement pour autoriser un processus par application, puis redémarrer son propre processus aussi souvent qu'il le souhaite. Vous ne savez pas exactement ce qui vous convient, mais le script ci-dessus répond à la question que vous avez posée. –

Questions connexes