通常,当重新启动Django runserver时,如果我使用相同的端口号,我会得到一个'端口已经在使用中'消息。随后,我需要每次增加端口号以避免这种情况。
然而,并非所有服务器都是如此,所以我想知道如何在我正在使用的当前系统上实现这一目标?
BTW,平台是Ubuntu 8.10答案 0 :(得分:122)
我发现这些信息(最初来自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
答案 1 :(得分:39)
您收到该消息是因为服务器已在运行(可能在后台)。确保终止进程(将其置于前台并按ctrl-c)以停止该进程。
答案 2 :(得分:29)
如果ps aux
命令(根据Meilo的回答)未列出您要杀死的进程但显示在netstat -np | grep 8004
网络活动中活动的端口,请尝试此命令(在Ubuntu上工作)
sudo fuser -k 8004/tcp
其中,8004是您要关闭的端口号。 这应该会终止与端口8004相关的所有进程。
答案 3 :(得分:14)
答案 4 :(得分:12)
fuser -k 8000/tcp
在终端中运行它在ubutu中运行。 8000
是端口。
答案 5 :(得分:9)
我正在回答一个更普遍的问题,不像Django那样具体,就像原来的问题一样。那些来自Google的人可以轻松解决问题。
当您需要清除端口时,您需要做的就是这两个步骤
fg
fg将流程带到前景。然后Control-C停止服务器。
在运行角度应用时,我的端口8000实际上遇到了这个问题。我跑npm start
所以我跑了fg
,然后我用Control-C停止了服务器
然后我就能成功运行服务器
答案 6 :(得分:6)
在终端中键入fg
以将后台任务调到前台。
按 Ctrl + C 关闭/停止正在运行的服务器。
答案 7 :(得分:6)
我使用pkill -If 'manage.py'
(-I
表示交互式,-f
匹配的不仅仅是进程名称)。有关pkill的详细信息,请参阅How to kill all processes with a given partial name?。
答案 8 :(得分:3)
sudo lsof -t -i tcp:8000 | xargs kill -9
如果您想要释放8000端口,而不仅仅是复制命令并粘贴到您的cmd中,它将要求输入sudo密码。然后你很高兴。
答案 9 :(得分:3)
如果您尝试的端口号是8001,请使用此命令
sudo fuser -k 8001/tcp
答案 10 :(得分:2)
重启Django服务器时,您不想简单地增加端口号。这将导致Django服务器的多个实例同时运行。更好的解决方案是终止当前实例并启动新实例。
为此,您有多种选择。最简单的是
Python2: $ killall -9 python
Python3: $ killall -9 python3
如果由于某种原因,这不起作用,你可以
$ kill <pid>
其中<pid>
是从简单$ ps aux | grep python
命令找到的进程ID。
答案 11 :(得分:1)
netstat -tulpn |grep 8000|awk '{print $7}'|cut -d/ -f 1|xargs kill
答案 12 :(得分:0)
在 manage.py
中添加以下库导入操作系统
导入子流程
汇入
现在在 if __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。
答案 13 :(得分: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
答案 14 :(得分:0)
你一定是在做控制+ z ..而是做控制+ c会杀死服务器会话......干杯!!!
答案 15 :(得分:0)
经常发生我写了一个别名来杀死名称中python
的进程(如果你有其他这样的进程,请小心)。现在我跑(没有Ubuntu)
kill $(ps | grep "python" | awk "{print $1}")
您甚至可以将python manage.py runserver ...
添加到同一个别名中,这样您就可以通过两次击键重新启动。
答案 16 :(得分:0)
在Leopard中,我引入了Activity Monitor并杀死了python。解决。
答案 17 :(得分:0)
就像mipadi所说,你应该终止服务器(ctrl + c)并返回命令提示符,然后再次调用manage.py runserver
。
唯一可能破坏这种情况的是,如果你以某种方式设法使runserver充当守护进程。如果是这种情况,我猜你正在使用Django测试服务器作为实际的Web服务器,你应该不做。 Django测试服务器是单线程的,缓慢且易碎的,仅适用于本地开发。
答案 18 :(得分:-1)
netstat -ntlp
请在此处查看我的完整答案。 https://stackoverflow.com/a/34824239/5215825