Rails服务器说端口已被使用,如何杀死该进程?


275

我在Mac上执行以下操作:

rails server

我得到:

2010-12-17 12:35:15] INFO  WEBrick 1.3.1
[2010-12-17 12:35:15] INFO  ruby 1.8.7 (2010-08-16) [i686-darwin10.4.0]
[2010-12-17 12:35:15] WARN  TCPServer Error: Address already in use - bind(2)
Exiting

我知道我可以在新端口上启动,但是我想取消该过程。

Answers:


694

假设您要杀死端口3000(webrick通常使用的端口)上的任何内容,请在终端中键入以下内容以找出进程的PID:

$ lsof -wni tcp:3000

然后,使用PID列中的数字来终止该进程:

$ kill -9 PID

4
您能解释一下-wni
user993563

53
只是为了向新手说明一下:在第二行代码中,您应该PID在输入第一行代码(例如12345)后将替换为控制台中显示的实际数字。
CodeBiker

5
您也可以通过您的轨道目录导航到以下文件TMP /的PID / server.pid找到PID
坦迪

如果您在RubyMine中运行调试器而崩溃或发生某些情况,则可能会发生这种情况……服务器停止运行,但调试器仍在继续……无论如何,这是我使用的解决方案,并且运行良好:)
J Smith

@tandy这是获取特定项目的PID的好方法,但是,有时当进程突然关闭时,文件可能不存在,但服务器仍可以运行。进行操作lsof -wni tcp:3000始终显示所有正在侦听该protocol:port组合的进程。(其中3000将替换为本地服务器端口。例如,在Rails中,默认值为3000)。
SidOfc

125

kill -9 $(lsof -i tcp:3000 -t)


3
括号之间的所有内容都将返回使用端口3000的进程ID。这-t意味着specifies that lsof should produce terse output with process identifiers only and no header - e.g., so that the output may be piped to kill(1).我想您知道该怎么kill
Papouche Guinslyzinho 2015年

这应该是公认的答案,因为它是“多合一”行。将此放在别名中,就可以了。
Nubtacular

如果包括解释,那么绝对值得推荐。
mwfearnley '16

2
这将杀死所有进程,包括所有打开的浏览器会话。因此,在尝试时要小心。
theterminalguy

1
请查看我对kill -9死记硬背/习惯使用答案的评论。
lindes

29

您需要使用tcp端口3000获取程序的进程ID。要获取进程ID

lsof -i tcp:3000 -t

然后使用该进程ID,只需使用ubuntu kill命令杀死进程即可。

kill -9 pid

或者只运行下面提到的Combine命令。它将首先获取pid,然后终止该进程。

kill -9 $(lsof -i tcp:3000 -t)

请查看我对kill -9死记硬背/习惯使用答案的评论。
lindes

17

对于在Mac上不在此问题上遇到麻烦的任何人:假设您知道服务器在端口3000上运行,则可以通过执行以下操作一次性完成此操作:

fuser -k 3000/tcp

但是正如Toby所提到的,在Mac OS中执行融合器是非常原始的,此命令在Mac上不起作用。


1
由于热熔器仅接受c,f和u作为选项,因此在mac上将无法使用(问题中规定了Mac)。
Toby

我已经更新了答案,它也解决了如何将其用于mac用户。没有理由特别是考虑其他人时就投下反对票,包括我自己在内,尽管没有遇到问题,但在过去曾偶然遇到过这个问题。
saneshark

添加-v标记还显示了有关杀死哪个进程的少量信息。这样fuser -kv 3000/tcp。Mac,MacOS的热熔器不具备此功能。kill $(lsof -ti tcp:3000)是相当接近的等价物。
lindes

14

有时,Rails服务器可能无法正确关闭。您可以找到导轨使用的过程

ps aux | grep rails

输出会像

user     12609  9.8  0.5  66456 45480 pts/0    Sl+  21:06   0:02 /home/user/.rvm/rubies/ruby-2.2.0-preview1/bin/ruby bin/rails s

在这里,rails服务器使用process_id 12609。

您可以通过命令轻松杀死它

杀死-9 12609


对我来说,这已成为“ ps aux | grep红宝石”。也许是从
Webrick

请查看我对kill -9死记硬背/习惯使用答案的评论。
lindes

我必须这样做才能找到正确的过程ps aux | grep puma
Sami Birnbaum

11

上面的所有答案都非常好,但是我需要一种在终端中键入尽可能少的内容的方法,因此我为此创建了一个gem。您只可以安装gem一次,并且每次想要杀死Rails进程时(在当前文件夹中时)运行命令“ shutup”。

gem install shutup

然后进入rails项目的当前文件夹并运行

shutup #这将杀死当前正在运行的Rails进程

您可以随时使用命令“ shutup”

求职者:我是这颗宝石的创造者

注意:如果您使用的是rvm,请在全局安装gem

rvm @global do gem install shutup

这很整洁。查看源代码,您的gem会查找pid文件,但这不能保证存在。该lsof方法更加可靠。
max pleaner

@maxpleaner:是的,如果这样做(可能是偶然的话),也更有可能杀死正在监听该端口的其他进程。
lindes

它在这里工作。如果您在2019年读这篇文章,请安装这种宝石,它确实有效,就轻松多了..只是运行gem安装shutup你的文件夹中,并且每次你需要杀死只需键入“shutup”
吉列尔梅努涅斯

我安装了这个宝石,然后运行它杀死了Sinatra。但是,从现在开始,默认端口4567不会响应,也不会由'set:port XXXX'命令设置的任何其他端口响应。我该如何处理?
NevD

2

ps aux | grep rails使用此命令可以杀死服务器


1

默认情况下,rails服务器使用端口3000。
因此,您有2个选项来运行rails服务器。
1.您可以通过使用以下命令定义自定义端口来在其他端口上运行服务器
rails s -p 3001
2.或者您可以通过运行以下命令杀死所有正在运行的ruby进程,
killall -9 ruby
然后运行rails server



-4

输入:

man lsof

然后寻找-w,-n和-i

-i:互联网内容-n:使速度更快-w:切换警告

手册页上有更多详细信息


-6

如果您在Windows计算机上,请执行以下步骤。

c:/project/
cd tmp
c:/project/tmp
cd pids
c:/project/tmp/pids
dir

在那里,您将找到一个名为server.pid的文件

删除它。

c:/project/tmp/pid> del *.pid

而已。

编辑: 请参阅此


3
这不会停止服务器。
纳法阿·布特弗

尽管此代码可能有助于解决问题,但是提供有关为什么和/或如何回答问题的其他上下文(尤其是为什么您认为对于Windows计算机的建议可能对指出其在MacOS上的问题很有用)将大大提高其长期价值。请编辑您的答案以添加一些说明。
Toby Speight
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.