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()