2014-04-16 2 views
0

헬프 데스크에서 Oracle 인스턴스를 다시 시작할 수 있도록하기 위해 Oracle 인스턴스를 시작하는 쉘 스크립트를 시작하는 작은 파이썬 웹 서버를 구현하려고합니다.BaseHTTPServer 내 데몬 프로세스 시작

코드가 완료되고 인스턴스가 시작되지만 문제가 발생합니다. 인스턴스가 웹 서버에 연결되어 있으므로 인스턴스가 중지되고 브라우저가 버퍼가 닫히지 않고 수신 대기 시간이 ora_pmon_INSTANCE 인 경우 웹 서버 포트에.

나는 함께 스크립트를 실행하려고 :

process = os.system("/home/oracle/scripts/webservice/prueba.sh TFINAN") 

process = subprocess.Popen(["/home/oracle/scripts/webservice/prueba.sh", "TFINAN"], shell=False, stdout=subprocess.PIPE)` 

하지만 같은 발생합니다.

또한 데몬으로 스크립트를 시작하려고했습니다 (redhat의 init 스크립트에서 데몬 기능 사용). 스크립트는 Oracle 인스턴스를 동일한 결과로 시작합니다.

#!/usr/bin/python 

from BaseHTTPServer import BaseHTTPRequestHandler, HTTPServer 
from SocketServer import ThreadingMixIn 
import threading 
import argparse, urlparse 
import re 
import cgi, sys, time 
import os, subprocess 

class HTTPRequestHandler(BaseHTTPRequestHandler): 

    def do_POST(self): 
     self.send_response(403) 
     self.send_header('Content-Type', 'text/html') 
     self.end_headers() 

     return 

    def do_GET(self): 
     ko = False 
     respuesta = "" 
     params = {} 
     myProc = -1 
     parsed_path = urlparse.urlparse(self.path) 
     try: 
      params = dict([p.split('=') for p in parsed_path[4].split('&')]) 
     except: 
      params = {} 

     elif None != re.search('/prueba/*', self.path): 
      self.send_response(200) 
      respuesta = "Hola Mundo! -->" + str(params['database']) 

     elif None != re.search('/startup/*', self.path): 
      self.send_response(200) 
      self.send_header('Content-Type', 'text/html') 
      self.end_headers() 
      cmd = """ <html> 
         <body><H2> Iniciando instancia oracle: """ + str(params["database"]) + '. Espere un momento, por favor ...</H2>' 

      self.wfile.write(cmd) 

      #process = os.system("/home/oracle/scripts/webservice/prueba.sh INSTANCE") 
      process = subprocess.Popen(["/home/oracle/scripts/webservice/prueba.sh", "INSTANCE"], shell=False, stdout=subprocess.PIPE) 
      # wait for the process to terminate 
      out, err = process.communicate() 
      errcode = process.returncode 
      if errcode == 0: 
       self.wfile.write("""<H1> Instancia iniciada correctamente 
           </H1> 
          </body> </html>""") 
       self.wfile.close() 
      else: 
       respuestaok = "Error inicializando la instancia: " + str(params['database']) + " Intentelo de nuevo pasados unos minutos y si vuelve a fallar escale la incidencia al siguiente nivel de soporte" 

     else: 
      self.send_response(403, 'Bad Request: pagina no existe') 
      respuesta = "Solicitud no autorizada" 

     if respuesta != "": 
      self.send_response(200) 
      self.send_header('Content-Type', 'text/html') 
      self.end_headers() 
      self.wfile.write(respuesta) 
      self.wfile.close() 

     if ko: 
      server.stop()   

     return 


class ThreadedHTTPServer(ThreadingMixIn, HTTPServer): 
    allow_reuse_address = True 

    def shutdown(self): 
     self.socket.close() 
     sys.exit(0) 

class SimpleHttpServer(object): 
    def __init__(self, ip, port): 
     self.server = ThreadedHTTPServer((ip,port), HTTPRequestHandler) 

    def start(self): 
     self.server_thread = threading.Thread(target=self.server.serve_forever) 
     self.server_thread.daemon = True 
     self.server_thread.start() 

    def waitForThread(self): 
     self.server_thread.join() 

    def stop(self): 
     self.server.shutdown() 

if __name__=='__main__': 
    parser = argparse.ArgumentParser(description='HTTP Server') 
    parser.add_argument('port', type=int, help='Listening port for HTTP Server') 
    parser.add_argument('ip', help='HTTP Server IP') 
    args = parser.parse_args() 

    server = SimpleHttpServer(args.ip, args.port) 
    print 'HTTP Server Running...........' 
    server.start() 
    server.waitForThread() 

가 너희 중에 누구든지 나를 도울 수 :

이 내 코드?

답변

0

문제는 HTTP 서버와 관련이 없습니다. 파이썬 코드에서 오라클 데몬을 제어하는 ​​데 일반적인 문제가있는 것 같습니다.

먼저 필요한 간단한 파이썬 스크립트를 작성해보십시오.

내 생각 엔 데몬 제어 스크립트의 출력을 읽는 데 문제가 있다는 것입니다.

명령에서 출력을 읽으려면 Popen.communicate()도 참조하십시오. 다른 옵션은 subrocess.call()을 호출하는 것일 수 있습니다.

Python에서 시스템 명령어를 호출하는 데 필요한 자습서가 많이 있습니다. this one

순수한 파이썬 관련 문제 외에, 권한 문제로 발생할 수 있습니다 - 스크립트/HTTP 서버를 실행하는 사용자가 오라클 제어 스크립트를 호출 할 수없는 경우 다른 문제가 있습니다 (해결책이있을 수 있습니다). 그 사용자를 sudoers에 추가하는 Linux).

스크립트를 호출 할 때 발생하는 문제를 해결 한 후에는 HTTP 서버 내부에서 쉽게 작업 할 수 있어야합니다.

관련 문제