gpt4 book ai didi

python - 在 BaseHTTPServer 中启动守护进程

转载 作者:太空宇宙 更新时间:2023-11-04 04:00:39 26 4
gpt4 key购买 nike

为了允许帮助台重新启动 Oracle 实例,我们正在尝试实现一个小型 python Web 服务器,该服务器将启动启动 Oracle 实例的 shell 脚本。

代码已完成,它启动了实例,但有一个问题:实例已连接到 Web 服务器,因此浏览器的缓冲区在实例停止之前不会关闭,并且有一个 ora_pmon_INSTANCE 进程正在监听 Web 服务器端口。

我尝试使用以下命令启动脚本:

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

你们谁能帮我吗?

最佳答案

您的问题与 HTTP 服务器没有太大关系。您似乎在从 Python 代码控制 Oracle 守护程序时遇到了一般问题。

首先尝试编写一个简单的 python 脚本,它可以满足您的需要。

我的猜测是,您的尝试在从守护进程控制脚本读取输出时遇到问题。

另请参阅Popen.communicate()用于读取命令的输出。其他选项可能是调用 subrocess.call()

有很多关于从Python调用系统命令的教程,例如this one

除了纯粹与Python相关的问题之外,您可能会遇到权限问题 - 如果您的用户运行脚本/HTTP服务器不允许调用oracle控制脚本,您还会遇到另一个问题(可能有一个解决方案,在Linux上将该用户添加到sudoers中)。

解决了调用脚本的问题后,可以很容易地使其在 HTTP 服务器内运行。

关于python - 在 BaseHTTPServer 中启动守护进程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23113840/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com