如何关闭Python的simpleHTTPserver?

74

我正在尝试学习d3,wiki建议:

要在本地查看示例,必须拥有本地Web服务器。任何Web服务器都可以工作;例如,您可以运行Python的内置服务器:

python -m SimpleHTTPServer 8888 &

好的...现在我已经运行了一个服务器...但是某个时候我想我可能应该把它关掉。是否有比使用kill <pid>更好的方法?那似乎有点大材小用。

(我正在运行Mac OS 10.6.8(Snow Leopard))

FWIW:ctrl+c会给出约10行回溯信息,指责被中断。

kill -3 <pid>会在单独的窗口中显示Finder警告“Python意外退出”。

默认的kill <pid>kill -15 <pid>相对干净(且简单)。


10
请勿使用符号“&”,而使用“Ctrl+C”进行复制。 :P - Joran Beasley
2
但我认为99%的人在现实生活中只是用 ctrl+c 来终止它。 - Joran Beasley
如果您正在使用bash或类似的shell,您可以执行 fg 然后按Control-C键(如果这是最后一个被放置在后台的进程)。或者您可以执行kill %%(同样,如果这是最后一个被放置在后台的进程)。如果您知道作业号码,也可以指定一个数字n,例如kill %n。运行 jobs 命令以列出后台作业。在shell手册中了解更多信息。 - user650654
从Python中如何在脚本内部终止SimpleHTTPServer? - Ciro Santilli OurBigBook.com
请查看此解决方案:https://dev59.com/83jZa4cB1Zd3GeqPc1qp#38943044 - Levon
显示剩余3条评论
10个回答

44

您只是向进程发送信号。kill 是一个发送信号的命令。

键盘命令Ctrl+C 发送 SIGINT,kill -9 发送 SIGKILL,kill -15 发送 SIGTERM。

您想发送哪个信号来结束服务器?


6
我希望您可以发送适当的信号来优雅地退出,而不会在系统或屏幕上留下垃圾。在使用"ctrl+c" 的情况下,我会得到大约10行追溯信息,指出它被中断了。这就像直接拔掉电源而没有正常关机一样。 - Suz
然后,您需要捕获和管理这些信号的接收,清理程序并退出(或者不退出,因为Python解释器不会在Ctrl+C上关闭)。标准模块signal可能会有用。 - xbello
这个答案展示了如何实现一个简单的SIGINT(Ctrl+C)捕获器并且退出时不显示“traceback”。 - xbello
1
只是为了补充/澄清,kill 并不是过度杀死(overkill)。它只是发送一个信号,默认为“嘿,关闭”。你的应用程序可以对不同的信号进行不同的处理。SIGTERMSIGKILLSIGHUPSIGQUIT 等都可以用 kill 发送。你应该阅读有关 kill 和不同类型进程的资料。 - Jonathan Vanasco
1
@Jonathan 是的,我刚刚阅读了手册。然而,我有点认为Python会有像“bye”或“q”这样的东西来关闭正在运行的模块。显然,我可以使用signals模块来捕获其中一个并优雅地关闭,但这并没有与SimpleHTTPServer一起打包。所以我可能会像99%的人一样去做。 - Suz
SignalSimpleHTTPServer 都是 Python 标准库的一部分,它们随 Python 一起提供。使用 ctl-c 来终止程序完全没有问题,但我个人更喜欢发送一个 kill 信号,因为我喜欢使用 & - Jonathan Vanasco

42

如果您已经使用以下方式启动了服务器

python -m SimpleHTTPServer 8888 

那么您可以按下ctrl + c来关闭服务器。

但是如果您使用

开启了服务器。
python -m SimpleHTTPServer 8888 &
python -m SimpleHTTPServer 8888 & disown

在结束进程之前,您需要先查看进程列表。

运行以下命令:

ps
ps aux | less

它将向您显示一些运行中的进程,就像这样..

PID TTY          TIME CMD
7247 pts/3     00:00:00 python
7360 pts/3     00:00:00 ps
23606 pts/3    00:00:00 bash

你可以从这里获取进程ID。通过运行此命令,可以杀死该进程。

kill -9 7247

这里的7247是Python ID。

另外,如果端口仍然开放,您可以使用以下命令关闭该端口:

fuser -k 8888/tcp

这里的8888是由Python打开的TCP端口。

希望现在清楚了。


这种方法有助于在将来运行服务器时避免不必要的步骤。 - s2t2
1
在 MacOS 上,使用 lsof -nti:8888 | xargs kill -9 释放端口,因为 fuser 命令不支持 -k 开关。 - Michael Schmid

19
MYPORT=8888; 
kill -9 `ps -ef |grep SimpleHTTPServer |grep $MYPORT |awk '{print $2}'`

就是这样!

解释命令行:

  • ps -ef :列出所有进程。

  • grep SimpleHTTPServer :筛选属于“SimpleHTTPServer”的进程。

  • grep $MYPORT :再次筛选属于“SimpleHTTPServer”的进程,其中端口为MYPORT(即:MYPORT=8888)。

  • awk '{print $2}' :打印结果的第二列,即PID(进程ID)。

  • kill -9 <PID> :强制结束具有相应PID的进程。


1
哇!太简单了! - Tony
感谢您回答问题! - Calvin Taylor

14

或者您可以只执行kill %1,这将终止放在后台的第一个作业


3
你不能确定是否为第一个后台作业。这并没有真正回答问题,因为使用“kill”已经在问题中提到了。 - Reinout van Rees
谢谢,这是唯一对我有效的方法。 - neaumusic
这个答案非常有效。@Reinout 如果你不确定,也许可以用命令“jobs”来查看后台作业的排队情况,例如: [1]+ 正在运行 python -m SimpleHTTPServer 8000 & - Juan Lanus

12

5
感谢您作为唯一提供编程方式关闭服务器的答案。这应该是得票最高的答案之一! - David Parks

5
当您将程序作为后台进程运行(在其后面添加 &),例如:
python -m SimpleHTTPServer 8888 &

如果终端窗口仍然打开,可以执行以下操作:
jobs

获取正在运行的shell进程中所有后台作业的列表。

示例如下:

$ jobs
[1]+  Running                 python -m SimpleHTTPServer 8888 &

要结束一个任务,您可以使用kill %1 来结束任务“[1]”,或者使用fg %1 将任务移到前台(fg),然后使用ctrl-c 来结束它。(只输入fg 将把最后一个后台进程移到前台)。
关于SimpleHTTPServer,似乎kill %1fg + ctrl-c更好。至少在使用kill指令时没有问题。
上述内容在Mac OS中经过测试,但就我所知,在Linux中也是一样的。
更新:为了使其正常工作,必须直接从命令行启动Web服务器(逐字复制第一个代码片段)。使用脚本启动将把该进程放到jobs无法触及的位置。

1
这是我可以通过命令行只需几个按键就能完成的唯一答案,并防止Python在命令行上喷出traceback。谢谢! - Anomaly
1
还有一些人可能不知道,如果你没有预见性地在命令后面加上 & 来让 python -m SimpleHTTPServer 8888 在后台运行,那么你可以先按 Ctrl-Z 将其挂起,然后像之前一样运行 jobs 命令来查看它的编号,最后使用 kill %1 命令将其杀死(如果它是作业 1)。 - Anomaly

3
似乎有点过度,但是你可以使用supervisor启动和停止你的simpleHttpserver,并完全将其作为服务进行管理。
或者按照建议在前台运行它并使用CtrlC结束它。

那看起来是一个合理的解决方案,虽然比我想要的多了一点。 - Suz

1
只需关闭运行启动HTTP服务器命令的终端窗口即可。

你的回答可以通过提供更多的支持性信息来改进。请编辑以添加进一步的细节,例如引用或文档,以便他人可以确认你的回答是否正确。你可以在帮助中心找到关于如何撰写好回答的更多信息。 - undefined
嗨 @tphan,欢迎来到Stack Overflow!感谢你的回答,"kill the terminal" 的确还不在答案列表中。希望你在这里度过愉快的时光。 - undefined

0
按下 CtrlC 一次(等待回溯),然后再次按下 CtrlC 对我起了作用 :)

我敢打赌你的命令里没有终端 &。使用 ctrl-c& 没有任何作用。 - Erk

0

这里有另一种解决方案。

假设您使用以下命令启动了服务器 -

python3 -m http.server 7800

要终止该进程,请使用 -

pkill -9 -f  'python3 -m http.server 7800

就是这样。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接