2010-11-24 8 views
0

Ich habe ein Python CGI-Skript, das überprüft, ob ein Prozess aktiv ist, und startet es, wenn dieser Prozess nicht gefunden wird. Der Prozess selbst ist ein Webserver (basierend auf web.py). Nachdem ich sichergestellt habe, dass der Prozess ausgeführt wird, versuche ich eine URL-Anfrage an ihn zu stellen. Die Idee ist, die Ergebnisse dieser Anfrage an den Anforderer meines CGI-Skripts umzuleiten, im Grunde möchte ich eine Abfrage an einen lokalen Webserver umleiten, der auf einen anderen Port hört.Aufruf von URL innerhalb von CGI-Skript, 'Verbindung abgelehnt' Fehler

Dieser Code funktioniert einwandfrei, wenn ich den Server zuerst gestartet habe (findImgServerProcess gibt True zurück), von einer Shell, die keine CGI-Anfragen verwendet. Aber wenn ich versuche, den Prozess über das cgi-Skript unten zu starten, komme ich so weit wie der Aufruf urllib2.urlopen, der eine Ausnahme auslöst, dass die Verbindung abgelehnt wird. Ich verstehe nicht warum? Wenn ich die Liste der Prozesse drucken (r in findImgServerProcess()) kann ich sehen, der Prozess ist da, aber warum wirft urllib2.urlopen eine Ausnahme? Ich habe den Apache2-Webserver eingerichtet, um suexec zu verwenden.

Hier ist der 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() 

Antwort

0

Eine Möglichkeit ist, dass der Unterprozess nicht die Möglichkeit hat, vollständig bis zu starten, bevor Sie versuchen, es zu verbinden. Um dies zu testen, versuchen Sie, vor dem Aufruf von urlopen ein time.sleep (5) hinzuzufügen.

Dies ist nicht ideal, aber wird Ihnen zumindest helfen, herauszufinden, ob das das Problem ist. Auf der anderen Seite werden Sie wahrscheinlich einen besseren Weg finden, um zu überprüfen, ob der HTTP-Daemon läuft und ihn weiterlaufen lässt.

Verwandte Themen