所以我正在尝试学习 d3,wiki 建议
要在本地查看示例,您必须有本地 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>
相对干净(而且简单)。
您只是向进程发送信号。
kill
是发送这些信号的命令。
键盘命令 Ctrl+C 发送 SIGINT,
kill -9
发送 SIGKILL,kill -15
发送 SIGTERM。
您想向服务器发送什么信号来结束它?
如果您已使用
启动服务器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
您可以从这里获取PID。并通过运行此命令来终止该进程..
kill -9 7247
这里 7247 是 python id。
此外,由于某种原因,如果端口仍然打开,您可以使用此命令关闭端口
fuser -k 8888/tcp
这里8888是python打开的tcp端口。
希望现在一切都清楚了。
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 强制终止进程。
或者你可以直接做
kill %1
,这会杀死放在后台的第一个作业
事实证明存在关闭,但这必须从另一个线程启动。
这个解决方案对我有用:https://stackoverflow.com/a/22533929/573216
当您将程序作为后台进程运行时(通过在其后面添加
&
),例如:
python -m SimpleHTTPServer 8888 &
如果终端窗口仍然打开,您可以执行以下操作:
jobs
获取正在运行的 shell 进程中所有后台作业的列表。
它可能看起来像这样:
$ jobs
[1]+ Running python -m SimpleHTTPServer 8888 &
要终止作业,您可以执行
kill %1
终止作业“[1]”,或执行 fg %1
将作业置于前台 (fg),然后使用 ctrl-c 终止它。 (只需输入 fg
即可将最后一个后台进程置于前台)。
就 SimpleHTTPServer 而言,似乎
kill %1
比 fg
+ ctrl-c 更好。至少它不会抗议kill命令。
上面已经在 Mac OS 中进行了测试,但据我记得它在 Linux 中的工作原理是一样的。
更新: 为此,必须直接从命令行启动 Web 服务器(逐字记录第一个代码片段)。使用脚本来启动它将使该过程超出
jobs
的范围。
这看起来有点矫枉过正,但你可以使用 supervisor 来启动和停止你的 simpleHttpserver,并将其作为服务完全管理。
或者按照建议在前台运行它,然后使用 CtrlC 杀死它。
点击 CtrlC 一次(等待回溯),然后再次点击 CtrlC 对我来说就成功了:)
这是另一种解决方案。
假设您已使用此命令启动服务器 -
python3 -m http.server 7800
要终止该进程,请使用 -
pkill -9 -f 'python3 -m http.server 7800
就是这样。
只需终止运行命令的终端即可启动 http 服务器。