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

Bla*_*man 266 ruby-on-rails

我在Mac上,做:

rails服务器

我明白了:

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
Run Code Online (Sandbox Code Playgroud)

我知道我可以在一个新端口上启动一个,但我想杀死这个过程.

idl*_*ers 663

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

$ lsof -wni tcp:3000
Run Code Online (Sandbox Code Playgroud)

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

$ kill -9 PID
Run Code Online (Sandbox Code Playgroud)

  • 只是为新手澄清:在第二行代码中,您应该在输入第一行代码(例如,`12345`)时将`PID`替换为控制台中显示的实际数字. (49认同)
  • 你能解释一下*-wni* (5认同)
  • 您还可以通过rails目录导航到以下文件tmp/pids/server.pid来查找PID (5认同)

Bij*_*jan 114

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

  • 括号之间的所有内容都将返回一个使用端口3000的进程ID.并且`-t`表示`指定lsof应该只生成带有进程标识符的简洁输出而没有标题 - 例如,以便输出可以通过管道传输来终止(1 ).我猜你知道`kill`会做什么 (3认同)
  • 这将终止所有进程,包括所有打开的浏览器会话.所以当你尝试时要小心. (2认同)

Sha*_*riq 28

您需要使用tcp port 3000获取程序的进程ID.获取进程ID

lsof -i tcp:3000 -t
Run Code Online (Sandbox Code Playgroud)

然后使用该进程id,只需使用ubuntu kill命令终止进程.

kill -9 pid
Run Code Online (Sandbox Code Playgroud)

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

kill -9 $(lsof -i tcp:3000 -t)
Run Code Online (Sandbox Code Playgroud)


san*_*ark 17

对于任何绊倒这个不在Mac上的问题的人:假设您知道您的服务器在端口3000上运行,您可以通过执行以下操作一次性执行此操作:

fuser -k 3000/tcp
Run Code Online (Sandbox Code Playgroud)

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


dev*_*lip 13

有时候rails服务器有可能无法正常关闭.您可以找到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
Run Code Online (Sandbox Code Playgroud)

您的rails服务器使用process_id 12609.

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

杀了-9 12609


Lor*_*isi 11

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

gem install shutup

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

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

您可以随时使用命令'shutup'

DICLAIMER:我是这个宝石的创造者

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

rvm @global do gem install shutup
Run Code Online (Sandbox Code Playgroud)


ave*_*dev 6

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

这是一个结合了端口和ruby字符串搜索的1-liner

kill -9 $(lsof -i tcp:3000 -t -c ruby -a)
Run Code Online (Sandbox Code Playgroud)

分解它是如何工作的:

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

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

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

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

-aall,并将-i和组合-c在一起


Sar*_*mar 5

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