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

我在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

我知道我可以在一个新的端口上启动一个进程,但是我想终止这个进程。

263012 次浏览

假设你想要杀死端口3000上的任何东西(这是webrick通常使用的),在你的终端中输入这个来找出进程的PID:

$ lsof -wni tcp:3000

然后,使用PID列中的数字杀死进程:

$ kill -9 PID

类型:

man lsof

然后寻找-w -n和-i

-i:网络东西 -n:加快速度 -w:切换警告

手册页上有更多的细节

对于任何无意中遇到这个问题的人,如果不是在Mac上:假设你知道你的服务器在端口3000上运行,你可以通过执行以下命令一次性完成:

fuser -k 3000/tcp

但正如Toby所提到的,fuser在Mac OS中的实现相当原始,这个命令在Mac上不起作用。

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

如果你使用的是windows机器,请遵循以下步骤。

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

这里有一个名为server.pid的文件

删除它。

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

这是它。

编辑: 请参考这个

有时有一个机会,rails服务器没有正确关闭。 您可以找到rails使用的进程

Ps aux | grep轨道

输出如下所示

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

这里process_id 12609被您的rails服务器使用。

你可以通过命令轻易地杀死它

杀死-9 12609

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

lsof -i tcp:3000 -t

然后使用进程id,使用ubuntu kill命令简单地杀死进程。

kill -9 pid

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

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

上面所有的答案都很好,但我需要一种方法来尽可能少地在终端中输入,所以我创建了一个宝石。你可以只安装一次gem,每次你想要终止Rails进程时(在当前文件夹中)运行命令'shutup'。

gem install shutup

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

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

你可以在任何时候使用“关闭”命令

我是这颗宝石的创造者

注意:如果你使用rvm全局安装gem

rvm @global do gem install shutup

使用此命令可以关闭服务器:

ps aux|grep rails

一句话解决方案:

kill -9 $(ps aux | grep 'rails s' | awk {'print$2'}); rails s

缺省情况下,rails服务器使用3000端口 所以,你有两个选项来运行rails服务器 1. 您可以使用以下命令
定义自定义端口,从而在其他端口上运行服务器 rails s -p 3001 < br > 2. 或者您可以通过执行以下命令
来终止所有正在运行的ruby进程 killall -9 ruby < br > 然后执行rails server

这是一个在windows中杀死进程的WSL脚本

PIDS=$(/mnt/c/windows/system32/cmd.exe /c netstat -ano | /mnt/c/windows/system32/cmd.exe /c findstr :$1 | awk '{print $5}')
for pid in $PIDS
do
/mnt/c/windows/system32/cmd.exe /c wmic process where "processid=$pid" delete
done

例子

myscriptname 8080

现有的答案很好,但我发现Bijan的答案撒得太广了,涵盖了可能不相关的过程。

下面是一个一行代码,它将port和ruby组合为字符串搜索

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

分解它的工作原理:

kill -9将杀死列出的进程。但是首先运行$( )中的命令

lsof -i tcp:3000列出了该端口上的所有进程

-t是简洁模式,所以只有pid

-c通过命令搜索,在本例中是ruby,因为我使用的是puma

-a代表all,并将-i-c组合在一起