Ubuntu环境下如何优雅关闭Python SimpleHTTPServer?
嘿,我之前在Ubuntu上用SimpleHTTPServer的时候也碰到过这个问题!其实Ctrl+C本身是正常的终止方式,那个回溯报错只是Python默认把异常栈打出来了,算不上真正的错误——但如果想让它关闭得更“干净”,看不到那些冗余的回溯信息,有几个实用的办法可以试试:
方法1:写个简单的自定义脚本捕获中断
直接用python -m SimpleHTTPServer启动的话,没法处理中断异常,所以会打印回溯。我们可以自己写个小脚本,手动捕获KeyboardInterrupt,让关闭过程更友好:
创建一个名为graceful_server.py的文件,内容如下:
from SimpleHTTPServer import SimpleHTTPRequestHandler from BaseHTTPServer import HTTPServer import sys if __name__ == "__main__": port = 8000 # 可以改成你需要的端口 try: server = HTTPServer(('', port), SimpleHTTPRequestHandler) print "Serving HTTP on 0.0.0.0 port {}...".format(port) print "Press Ctrl+C to stop the server gracefully." server.serve_forever() except KeyboardInterrupt: print "\nServer stopped gracefully." server.socket.close() sys.exit(0)
然后运行这个脚本:
python graceful_server.py
现在按Ctrl+C,只会看到友好的停止提示,再也不会有烦人的回溯信息了~
方法2:命令行屏蔽错误输出(快速方案)
如果不想写脚本,只想临时解决回溯显示的问题,可以在启动命令后面加上错误重定向,把异常信息扔到“黑洞”里:
python -m SimpleHTTPServer 8000 2>/dev/null
这个方法只是屏蔽了输出,本质还是用Ctrl+C终止服务器,但至少不会看到那些回溯内容了,适合临时快速使用。
方法3:用kill命令优雅终止后台进程
如果你的服务器是在后台运行的(比如启动时加了&,像python -m SimpleHTTPServer 8000 &),可以用kill命令发送终止信号来优雅关闭:
- 先找到服务器的进程ID(PID):
ps aux | grep SimpleHTTPServer
- 找到对应的PID后,用
kill命令发送默认的TERM信号:
kill <你的PID>
这个信号会让服务器正常退出,不会产生任何回溯信息。如果服务器没响应,再用kill -9 <PID>强制终止,但这个就不算“优雅”了,尽量先用普通的kill命令。
补充说明
其实你看到的回溯信息只是Python的默认行为——Ctrl+C已经成功终止了服务器,只是Python把中断异常的栈信息打印出来了而已。上面的几种方法要么捕获异常屏蔽输出,要么用外部信号正常终止,都能达到“优雅关闭”的效果,根据你的使用场景选就行~
内容的提问来源于stack exchange,提问作者Anurag Bansal

