重新启动django runserver时如何“清除”端口


69

通常,在重新启动Django Runserver时,如果我使用相同的端口号,则会收到“端口已在使用中”消息。随后,我需要每次都增加端口号以避免这种情况。

但是,并非在所有服务器上都是如此,所以我想知道如何在正在使用的当前系统上实现此目标?

顺便说一句,平台是Ubuntu 8.10


这个问题不仅适用于Django,还可以更改标题吗?运行Angular应用程序时遇到此错误。我在Google搜索中发现了这个问题,how to kill port 8000但它也适用于我。通过更改标题并使范围更加笼统,我们以后可以避免一些多余的问题。
JGallardo 2014年

试试这个sudo fuser -k 8001/tcp
hassanzadeh.sd

Answers:


40

之所以收到该消息,是因为服务器已经在运行(可能在后台)。确保终止该进程(将其移到前台并按ctrl-c)以停止该进程。


Ctrl + z为撤消。如果没有看到命令提示符,则您的服务器仍在运行。
苏联

15
ctrl-z在后台放置一个进程,因此即使服务器仍在运行(在后台),也可以看到命令提示符。
mipadi

25
fg将其带到了前台。然后按ctrl + c停止/关闭它。
irl_irl

125

我找到了这些信息(最初来自KristinnÖrnSigurðsson)来解决我的问题:

要使用-9杀死它,您将必须列出所有正在运行的manage.py进程,例如:

ps aux | grep -i manage

如果已经在许多端口上启动,您将获得类似于以下的输出:

14770     8264  0.0  1.9 546948 40904 ?        S    Sep19   0:00 /usr/local/bin/python manage.py runserver 0.0.0.0:8006
14770    15215  0.0  2.7 536708 56420 ?        S    Sep13   0:00 /usr/local/bin/python manage.py runserver 0.0.0.0:8001
14770    30144  0.0  2.1 612488 44912 ?        S    Sep18   0:00 /usr/local/bin/python manage.py runserver 0.0.0.0:8000
14770    30282  0.0  1.9 678024 40104 ?        S    Sep18   0:00 /usr/local/bin/python manage.py runserver 0.0.0.0:8002
14770    30592  0.0  2.1 678024 45008 ?        S    Sep18   0:00 /usr/local/bin/python manage.py runserver 0.0.0.0:8003
14770    30743  0.0  2.1 678024 45044 ?        S    Sep18   0:00 /usr/local/bin/python manage.py runserver 0.0.0.0:8004

然后,您必须为正确的manage.py进程(python manage.py runserver ...等)选择pid(这是左侧的第二个数字),然后执行以下操作:

kill -9 pid

对于上面的示例,如果要释放端口8000,请执行以下操作:

kill -9 30144

只是想补充一点,该解决方案适用于在OS X Lion,Django 1.2.0b1上运行Python 2.6.2的同事。谢谢!
spiffyman's

我用Ctrl + C停止了Django服务器,但进程继续运行。这个答案是解决方案,应该接受。
亚历杭德罗·加西亚·伊格莱西亚斯

“ ps aux | grep -i runserver”的输出似乎比“ ps aux | grep -i manage”的输出少。
Vasiliy Toporov

29

如果ps aux命令(按照Meilo的回答)没有列出您要杀死的进程,但显示了netstat -np | grep 8004网络活动中处于活动状态的端口,请尝试此命令(在Ubuntu上有效)。

sudo fuser -k 8004/tcp

其中,8004是您要关闭的端口号。这将终止与端口8004相关的所有进程。


2
在Mac上使用:sudo lsof -t -i tcp:8000 | xargs kill -9帽子提示:stackoverflow.com/questions/20239232/...
亚当Starrh

14

不,他不是一个白痴家伙。我也一样 显然,这是python UUID进程的一个错误,在django服务器关闭后,该UUID进程继续运行很长时间,这将端口绑定了。


2
我的豹子也有同样的问题。我用Ctrl-C将其关闭,但端口仍被阻止。
mamcx

13
fuser -k 8000/tcp

在终端中运行,它可以在ubutu中运行。8000是港口。


我收到此错误,并且已经尝试过了。您还有其他解决方案吗?
wanderer0810 2009年

事实证明postgres没有运行。如果Postgres没有运行,则它不会在端口5432上监听。我启动了它,它的工作原理很吸引人。
wanderer0810 2009年

9

此错误是由于服务器已经在运行。

背景

我正在像原始问题所要求的那样在不特定于Django的更通用级别上进行回答。这样,那些来自Google的用户就可以轻松解决此问题。

当需要清除端口时,只需要做以下两个步骤

  1. 在终端运行 fg
  2. 按Ctrl-C(如果在Mac上)

说明

fg将流程置于前台。然后Control-C停止服务器。

运行有角度的应用程序时,我的端口8000实际上遇到了这个问题。我跑步时遇到错误npm start

在angular-seed@0.0.0启动脚本错误时失败

所以我跑了fg,然后我用Control-C停止了服务器,

fg

然后我成功地运行了服务器

npm开始


7

类型 fg在终端弹出后台任务的前景。

Ctrl+C关闭/停止正在运行的服务器。



5
sudo lsof -t -i tcp:8000 | xargs kill -9

如果您想释放8000端口,而不仅仅是复制命令并粘贴到cmd中,它将要求输入sudo密码。然后您就可以开始了。


3

如果您尝试的端口号是8001,请使用此命令

sudo fuser -k 8001/tcp

2

重新启动Django服务器时,您不想简单地增加端口号。这将导致同时运行多个Django服务器实例。更好的解决方案是杀死当前实例并启动新实例。

为此,您有多种选择。最简单的是

Python2: $ killall -9 python

Python3: $ killall -9 python3

如果由于某种原因这不起作用,您可以这样做

$ kill <pid><pid>从简单$ ps aux | grep python命令中找到的进程ID在哪里。


1
netstat -tulpn |grep 8000|awk '{print $7}'|cut -d/ -f 1|xargs kill

+1不错的答案:我打算去写这个回复,因为netstat成为问题的核心。
杰夫·谢菲尔德

0

就像mipadi所说的那样,您应该终止服务器(ctrl + c)并返回到命令提示符,然后manage.py runserver再次调用。

唯一可能破坏此状况的是,如果您设法使runserver充当守护程序。如果是这样的话,我猜你使用Django的测试服务器为实际的Web服务器,你应该这样做。Django测试服务器是单线程的,速度慢且脆弱,仅适用于本地开发。


没有,我有这个问题太... specifially让Eclipse管理终止测试服务器的时候...我认为这可能发生,因为在测试服务器上的东西结果凝固起来
Jiaaro

我建议仅启动测试服务器并使其运行。它会自动检测对python文件的更改并自行重启。无需点击“运行”按钮。
苏联2009年

0

在Leopard中,我打开活动监视器并杀死python。解决了。


0

发生的次数如此之多,以至于我写了一个别名来杀死python名称为的进程(如果您有其他此类进程,请小心)。现在我就运行了(没有Ubuntu)

kill $(ps | grep "python" | awk "{print $1}")

您甚至可以添加python manage.py runserver ...到相同的别名,以便可以通过两次击键重新启动。


0

您必须一直在执行control + z ..而是执行control + c,这将终止服务器会话...干杯!


0

https://stackoverflow.com/a/27138521/1467342转发:

您可以使用此脚本代替./manage.py runserver。我把它放进去了scripts/runserver.sh

#!/bin/bash

pid=$(ps aux | grep "./manage.py runserver" | grep -v grep | head -1 | xargs | cut -f2 -d" ")

if [[ -n "$pid" ]]; then
    kill $pid
fi

fuser -k 8000/tcp
./manage.py runserver

0

manage.py中添加以下库

导入os
导入子流程
导入重新

现在,在__name__ ==“ __main__”之后添加以下python代码

ports = ['8000']
popen = subprocess.Popen(['netstat', '-lpn'],
                         shell=False,
                         stdout=subprocess.PIPE)
(data, err) = popen.communicate()
pattern = "^tcp.*((?:{0})).* (?P<pid>[0-9]*)/.*$"
pattern = pattern.format(')|(?:'.join(ports))
prog = re.compile(pattern)
for line in data.split('\n'):
    match = re.match(prog, line)
    if match:
        pid = match.group('pid')
        subprocess.Popen(['kill', '-9', pid])

这将首先找到端口8000的进程ID,将其杀死,然后重新启动您的项目。现在,您无需每次手动杀死pid。


By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.