2010-11-24 6 views
0

「接続が拒否」、およびこのプロセスが見つからなかった場合は、それを開始します。プロセス自体はwebserver(web.pyに基づいています)です。プロセスが実行されていることを確認した後、私はそのプロセスにURLリクエストを試みます。アイデアは、基本的に、私は別のポートをリスニングローカルウェブサーバへのクエリをリダイレクトしたい、私のCGIスクリプトの要求者にこの要求の結果をリダイレクトすることです。私はCGI要求を使用していない、シェルから、(findImgServerProcessがTrueを返す)最初のサーバーを起動している場合は、CGIスクリプト内からurlopen呼び出し、私はプロセスがアクティブであるかどうかを確認するのpythonのcgiスクリプトを持っているエラー

このコードは正常に動作します。私は以下のCGIスクリプトによるプロセスを開始しようとした場合でも、私は、接続が拒否されていることを例外をスローurllib2.urlopen呼び出し、限り入手できます。 私はなぜ理解していませんか? プロセスのリスト(rfindImgServerProcess())に印刷すると、そのプロセスが表示されますが、なぜurllib2.urlopenは例外をスローしますか?私はsuexecを使うようにapache2ウェブサーバを設定しました。

ここでは、コードです:

#!/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() 

答えて

0

可能性がサブプロセスは、あなたがそれに接続しようとする前に、完全に起動する機会がなかったということですが。これをテストするために、あなたもまた、urlopenを呼び出す前にtime.sleep(5)を追加してみてください。

これは理想的ではありませんが、少なくともそれが問題であるかどうかを判断するのに役立ちます。道を行くと、おそらく、HTTPデーモンが実行されていることを確認し、HTTPデーモンを実行し続けるより良い方法を設定したいと思うでしょう。

関連する問題