2010-11-24 42 views
0

J'ai un cgi-script python qui vérifie si un processus est actif, et le lance si ce processus est introuvable. Le processus lui-même est un serveur web (basé sur web.py). Après m'être assuré que le processus est en cours d'exécution, j'essaie de faire une demande d'URL. L'idée est de rediriger les résultats de cette requête vers le demandeur de mon script cgi, fondamentalement je veux rediriger une requête vers un serveur web local qui écoute un port différent.Appel d'urlopen à partir du script cgi, erreur 'connection refused'

Ce code fonctionne correctement si j'ai démarré le serveur en premier (findImgServerProcess renvoie True), à ​​partir d'un shell, sans utiliser les requêtes cgi. Mais si j'essaie de démarrer le processus via le script cgi ci-dessous, j'arrive aussi loin que l'appel urllib2.urlopen, ce qui jette une exception que la connexion est refusée. Je ne comprends pas pourquoi? Si j'imprime la liste des processus (r dans findImgServerProcess()) Je peux voir le processus est là, mais pourquoi urllib2.urlopen lance une exception? J'ai le serveur web apache2 configuré pour utiliser suexec.

Voici le code:

#!/usr/bin/python 
import cgi, cgitb 
cgitb.enable() 
import os, re 
import sys 
import subprocess 

import urllib2 
urlbase = "http://localhost:8080/getimage" 
imgserver = "/home/martin/public_html/cgi-bin/stlimgservermirror.py" # this is based on web.py 

def findImgServerProcess(): 
    r = subprocess.Popen(["ps", "aux"], stdout=subprocess.PIPE, stderr=subprocess.STDOUT).communicate()[0] 
    return re.match(".*%s" % os.path.split(imgserver)[-1], r, re.DOTALL) 

def ensureImgServerProcess(): 
    if findImgServerProcess(): 
     return True 

    os.environ['LD_LIBRARY_PATH'] = '/home/martin/lib' 
    fout = open("/dev/null", "w") 
    ferr = fout 
    subprocess.Popen([sys.executable, imgserver], stdout=fout, stderr=subprocess.STDOUT) 
    # now try and find the process 
    return findImgServerProcess() != None 

def main(): 
    if not ensureImgServerProcess(): 
     print "Content-type: text/plain\n" 
     print "image server down!" 
     return 

    form = cgi.FieldStorage() 
    if form.has_key("debug"): 
     print "Content-type: text/plain\n" 
     print os.environ['QUERY_STRING'] 
    else: 
     try: 
      img = urllib2.urlopen("%s?%s" % (urlbase, os.environ['QUERY_STRING'])).read() 
     except Exception, e: 
      print "Content-type: text/plain\n" 
      print e 
      sys.exit() 
     print "Content-type: image/png\n" 
     print img 

if __name__ == "__main__": 
    main() 

Répondre

0

Une possibilité est que le sous-processus n'a pas eu l'occasion de commencer complètement avant d'essayer de s'y connecter. Pour tester cela, essayez d'ajouter un time.sleep (5) avant d'appeler urlopen.

Ceci n'est pas idéal, mais vous aidera au moins à déterminer si c'est le problème. Au bout du compte, vous voudrez probablement mettre en place un meilleur moyen de vérifier que le démon HTTP est en cours d'exécution et de le faire tourner.