无法停止 Rails 服务器

151
我是rails的新手,使用的是ubuntu机器和rubymine IDE。问题在于我无法停止rails服务器。我尝试通过杀死rails进程来停止服务器,但是当我运行pgrep -l rails时,没有找到这样的进程。因此,我只能杀死ruby进程,但是服务器仍然无法停止。我尝试了./script/server stop(因为我是通过运行./script/server start来启动它的),但是那并没有起作用。在Google上搜索并找到一些stackoverflow文章后,我尝试更改本地主机端口的监听端口,但没有成功。有人可以帮忙吗?

2
按下 Ctrl-C 关闭服务器。 - gabrielhilal
@Newben你想结束所有的进程吗? - Learner
@Sri,是的,我想要终止所有进程。 - epsilones
1
@Newben,请查看我下面更新的答案,试一试并让我知道结果。 - Learner
27个回答

355

您可以使用以下其他端口:

rails server -p 3001

通常在终端中,您可以尝试使用Ctrl + C来关闭服务器。

关闭Ruby on Rails默认服务器(即WEBrick)的另一种方法是:

kill -INT $(cat tmp/pids/server.pid)

在终端中找到进程的PID:
$ lsof -wni tcp:3000

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

例如:

$ kill -9 PID

我找到的其他一些答案是:

在运行中停止rails服务器,请按:

CTRL-C
CTRL-Z

你将重新回到控制台界面,然后输入以下内容(不带$):

$ fg

更新的回答:

你可以使用 killall -9 rails 命令来关闭所有包含 "rails" 名称的正在运行的应用程序。

killall -9 rails

这样可以让进程正常退出而不需要手动结束。虽然有点麻烦,但这是比手动终止进程更好的方法,也是我能想到的最好的办法。


抱歉,lsof -wni tcp:3000没有返回任何内容,而且我没有任何tmp/pids/文件夹。 - epsilones
尝试运行 fuser -n tcp 3000 命令,如果有进程在该端口上运行,则杀死该进程。然后重新启动服务器。或者您可以在另一个端口上启动服务器,命令为 ruby script/server -p 3001 - Learner
如果是空的,那么你可以像平常一样启动Rails服务器进行检查...并尝试重新启动机器以获得更好的结果...有时候它会起作用... - Learner
1
这些命令对我都没有用。不过,重新启动机器解决了问题。 - Herb Meehan
根据我的经验,进程被称为Ruby而不是Rails,因此killall -9 ruby完成了工作。 - Arye Eidelman
显示剩余4条评论

56
您可以按以下方式使用grep命令:
ps aux | grep rails

然后

kill -9 {process_id} 

实际上,这个命令只会捕获“0:00 grep --color=auto rails”,我猜这是调用grep的命令... - epsilones
感谢这个解决方案,它适用于即使终端强制关闭也仍在运行的服务器。不错! - ksugiarto
如果我有很多进程,而且我不想一个一个手动杀死它们怎么办? - Nickolay Kondratenko
你可以通过执行 killall -9 rails 命令来结束所有 Rails 进程。 - maximus ツ
为了找到服务器,我不得不执行 ps aux | grep puma - Sami Birnbaum

34

pkill -9 rails 杀掉所有rails进程

更新后的答案

ps aux|grep 'rails'|grep -v 'grep'|awk '{ print $2 }'|xargs kill -9

这将会杀死任何正在运行的rails进程。将 'rails' 替换为其他进程名可以杀死其他进程。


29

在我的MAC上,killall -9 rails不能生效。但是killall -9 ruby可以。


1
一样的。这也是“COMMAND”值。 - IIllIIll
这是唯一对我有效的解决方案,在Mac上以及在容器中。 - ahrampy
这也是WSL上唯一的解决方案。 - Lam Phan

22

以下是终止服务器进程的步骤:

1. lsof -i tcp:3000

2. kill -9 1234

其中1234是在第一步中显示的进程PID:localhost:3000。

或者

删除Rails.root/tmp/pids/下的文件(server.pid),然后重新启动服务器。

或者

使用以下命令在另一个端口中打开应用程序:

rails s -p 3001


11

我通常使用以下命令:

killall ruby

或者

pkill -9 ruby

这将会杀死所有与Ruby相关的进程,例如rails serverrails console等。


如果您不了解pkill -9或kill -9,那么值得注意的是,这可能会杀死其他Ruby进程,例如rubymine IDE。 - Kjell

8

1. 只需从Rails应用程序目录中删除pid文件

Rails_app -> tmp -> pids -> pid文件

删除该文件并运行

rails start


2. 对于Rails 5.0及以上版本,您可以使用以下命令

rails restart


6

如果您正在使用更现代版本的Rails,并且它使用Puma作为Web服务器,您可以运行以下命令来查找卡住的Puma进程:

ps aux | grep puma

这将会产生类似于以下的输出结果:
85923 100.0  0.8  2682420 131324 s004  R+    2:54pm   3:27.92 puma 3.12.0 (tcp://0.0.0.0:3010) [my-app]
92463   0.0  0.0  2458404   1976 s008  S+    3:09pm   0:00.00 grep puma

你希望找到没有使用 `grep` 命令的进程。在这个例子中,该进程 ID 为 85923。
可以运行以下命令来终止该进程:
kill -9 85923

enter image description here


3

通常情况下,Ctrl-Z 应该就能解决问题了。


3

这很简单

pkill -9 ruby

没有多余的,也没有少了的


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接