python脚本退出后关闭BaseHTTPServer套接字

时间:2014-12-08 18:56:39

标签: python sockets basehttpserver

我已经搜索了我的问题的解决方案,并找到了一些,但它们不适合我,或者对我想要达到的目标非常复杂。

我有一个python(2.7)脚本,它使用线程创建3个BaseHTTPServers。我现在希望能够从自身关闭python脚本并重新启动它。为此,我创建了一个名为" restart_script"的额外文件。有了这个内容:

sleep 2
python2 myScript.py

然后我启动这个脚本,然后关闭我自己的python脚本:

os.system("nohup bash restart_script & ")
exit()

这很好用,python脚本关闭,2秒后弹出新的脚本,但BaseHTTPServers没有出现,地址已经在使用的报告。 (socket.error Errno 98)。

我使用以下命令启动服务器:

httpd = server_class((HOST_NAME, PORT_NUMBER), MyHandler)

然后我让它永远服务:

thread.start_new_thread(httpd.serve_forever, tuple())

我选择尝试这个:

httpd_thread = threading.Thread(target=httpd.serve_forever)
httpd_thread.daemon = True
httpd_thread.start()

但这有相同的结果。

如果我使用strg + c杀死脚本然后在此之后再次启动它,一切正常。我想只要我想从它自己重新启动脚本,旧的进程仍然以某种方式处于活动状态,我需要以某种方式拒绝它以便可以清除套接字。

我在Linux(Xubuntu)上运行。

我怎样才能真正杀死自己的脚本,然后在几秒钟后重新启动它以便所有套接字都关闭?

1 个答案:

答案 0 :(得分:1)

我找到了解决我具体问题的答案。

我只是使用另一个脚本,它使用os.system()启动我的主程序。如果脚本想要重新启动,我只是定期关闭它,另一个脚本只是重复启动它,一遍又一遍......

如果我想实际关闭我的脚本,我会添加一个文件并检查其他脚本是否存在此文件。

restart-helper-script如下所示:

import os, time

cwd = os.getcwd()

#first start --> remove shutdown:
try:
    os.remove(os.path.join(cwd, "shutdown"))
except:
    pass

while True:
    #check if shutdown requested:
    if os.path.exists(os.path.join(cwd, "shutdown")):
        break
    #else start script:
    os.system("python2 myMainScript.py")
    #after it is done, wait 2 seconds: (just to make sure sockets are closed.. might be optional)
    time.sleep(2)