Python:http.server.HTTPServer:如何关闭所有打开的文件?

时间:2018-08-10 01:48:53

标签: python unix lsof python-3.7 basehttpserver

因此,基本上,我正在用Python 3制造一个HTTP webhooks服务器,并想添加一个重启功能,因为将在其上运行的服务器上对shell的访问非常有限。

我早些时候在Stack Overflow的某个地方找到了该代码段:

library(tidyr)
separate(ranks, `Rank, Player`, into = c("Rank", "Player"), sep="(?<=[0-9])\\.")

在大多数情况下,它可以工作,但是我想确保使用def restart_program(): """Restarts the current program, with file objects and descriptors cleanup """ try: p = psutil.Process(os.getpid()) fds = p.open_files() + p.connections() print (fds) for handler in fds: os.close(handler.fd) except Exception as e: logging.error(e) python = sys.executable os.execl(python, python, *sys.argv) 进行了一些测试,发现每次重新启动服务器时,列表中又添加了两行(文件)的打开文件:

lsof

(每次重启的地址各不相同)

这些仅在我启动python3 13923 darwin 5u systm 0x18cd0c0bebdcbfd7 0t0 [ctl com.apple.netsrc id 9 unit 36] python3 13923 darwin 6u unix 0x18cd0c0beb8fc95f 0t0 ->0x18cd0c0beb8fbcdf 时出现。但是即使在我调用httpd = ThreadingSimpleServer((host, port), Handler)之后,这些打开的文件仍然存在,并且psutil似乎找不到它们。

这不是真正必需的功能。如果事实证明这会造成太多开销,那么我可以删除它,但是现在我只对为什么我的代码不起作用以及我自己的理智的解决方案感兴趣。

谢谢!

更新

httpd.server_close()更改为p.connections()后,我得到了p.connections(kind='all')类型的fd。仍然不确定如何关闭unix类型的fd。原来systm fd与DNS有关...

更新

好吧,看来我找到了解决方案,但可能很麻烦。

unix

虽然不漂亮,但是可以。

如果有人能阐明实际情况/正在发生的事情,我非常想知道。

1 个答案:

答案 0 :(得分:0)

嗯,这似乎是重新启动进程的一种非常骇人听闻的方式,而且通常是一个坏主意。您的用例是什么?为什么要重新开始流程?无论您的动机如何,在这种意义上与流程进行交互的通常方式都是通过信号。我不知道专门为重启进程而设计的信号。通常您想要做的是终止它(SIGTERM),也许会有类似systemd或zdaemon之类的东西会自动重新启动它。您甚至可以编写信号处理程序以在SIGTERM上执行清除功能,并且 是清除的正确方法。但是,您通常不希望重新启动进程,更不用说从应用程序本身进行了。看来是麻烦的秘诀。