40

在我的 Rails 项目中,我试图在不同的端口上运行两个不同的服务器。但它通过在控制台给出此错误而失败。

C:\Rails>rails s
=> Booting Mongrel
=> Rails 3.1.1 application starting in development on http://0.0.0.0:3000
=> Call with -d to detach
=> Ctrl-C to shutdown server
A server is already running. Check C:/Rails/tmp/pids/server.pid.Exiting

请检查更新的答案。

4

14 回答 14

52

在谷歌搜索了很多之后,我只是删除了该文件并重新启动服务器。然后再次系统创建该文件,然后我再次删除该文件。现在服务器运行良好。System 在同一个地方生成另一个副本。但它运行良好。

DELETE THAT FILE ....

如果您想运行两台服务器,那么它可能会再次造成麻烦。所以

这两个命令都在检查默认的 PID 文件位置 (tmp/pids/server.pid),因此您会看到此错误。尝试像这样运行多个服务器:

Server 1: bundle exec rails s

Server 2: bundle exec rails s -p 3001 -P tmp/pids/server2.pid

信用:https ://stackoverflow.com/a/14446920/1376448

谢谢

Connor Leech 对 Forman Gem 发表评论后更新

Foreman 可以帮助管理 Rails 应用程序在开发中运行时所依赖的多个进程。它还提供了一个导出命令来将它们转移到生产环境中。

于 2013-02-28T04:18:41.810 回答
38

您可以使用 netstat 知道哪个进程正在持有 rails webserver,然后您可以杀死 pid 并重新启动它,假设由于某种奇怪的原因服务器没有响应或在后台运行并且您没有找到其他方法重启吧。。

netstat -plntu | grep 3000
tcp        0      0 0.0.0.0:3000            0.0.0.0:*               LISTEN      7656/ruby

最后一列显示PID和进程名,那么你只需要:

kill -9 7656

rails s让它再次工作......

希望有用

于 2013-02-28T04:28:10.687 回答
16

我发现自己经常回到这个网页来查找lsof -wni tcp:3000命令,所以我发现这种方法更容易。

如果您收到此消息:

A server is already running. Check /Users/username/project/tmp/pids/server.pid.
Exiting

如果您在 unix 系统(mac 或 linux)上运行,您可以运行以下命令:

$ cat /Users/username/project/tmp/pids/server.pid

# output

71030

# Kill the process

$ kill -9 71030

然后再次运行您的服务器!

于 2014-08-22T03:15:29.803 回答
15

我删除了 cd'ing 到 tmp 目录中的文件,然后删除了文件

rm server.pid

然后我重新启动了服务器,我得到了这个错误

Exiting/Users/josephmellin/.rvm/rubies/ruby-2.1.1/lib/ruby/2.1.0/socket.rb:206:in `bind': Address already in use - bind(2) for 0.0.0.0:3000 (Errno::EADDRINUSE)

然后我可以使用以下命令来查看正在运行的进程。

sudo lsof -iTCP -sTCP:LISTEN -P | grep :3000

在我输入密码后,我得到了这个响应

ruby      2786 josephmellin   12u  IPv4 0xfeadd8ae849eaec9      0t0  TCP *:3000 (LISTEN)

然后用以下命令杀死进程

KILL -9 2786

然后重新启动服务器(您将拥有与 2786 不同的数字 - 我将其留在这里用于演示目的)

于 2014-06-16T16:55:43.347 回答
3

第 1 步:删除 .pid

C:/Rails/tmp/pids/server.pid.Exiting

# IN linux/unix shell
$ rm -rf <path to file>

有时这并不能解决问题,那么您必须终止 localhost 运行的进程,对于这种情况,请遵循STEP 2

第 2 步:列出 localhost 的进程并终止它

# For Linux/Unix shell

$ lsof -wni tcp:3000

# output
COMMAND  PID  USER   FD   TYPE DEVICE SIZE/OFF NODE NAME
ruby    5946 rails   11u  IPv4  79073      0t0  TCP *:3000 (LISTEN)
ruby    5946 rails   12u  IPv4 103786      0t0  TCP 127.0.0.1:3000->127.0.0.1:53612 (ESTABLISHED)

# Kill the running process
$ kill -9 5946

再次运行你的服务器

rails server
于 2014-03-03T07:43:26.093 回答
3
ps aux | grep rails
           or 
bundle exec rails s -p 3001 -P tmp/pids/server2.pid
于 2015-06-25T12:41:45.467 回答
2

RoR 服务器的每个实例都会创建一个 PID 文件。默认情况下是

#{Rails.root}/tmp/pids/server.pid

如果该文件已经存在,它将拒绝启动新服务器。

要在同一台机器上运行同一项目的多个服务器,您应该使用以下-P选项手动指定服务器的每个实例的 PID 文件名(我建议简单地附加一个连字符和端口号):

rails s -p 1234 -P tmp/pids/server-1234.pid

有人告诉我,在某些情况下您可能需要提供完整(而不是相对)路径,但我不知道这些情况是什么。

于 2013-12-17T19:29:01.120 回答
1

您可以看到每个进程的 PID(第一列):

ps vax | grep rails
// OR:  ps auxw | grep rails

5236 pts/1    Sl+    1:46   2   0.2 /usr/bin/ruby1.9.1 script/rails s -p 3001
5298 pts/2    Sl+    0:12   2   0.7 /usr/bin/ruby1.9.1 script/rails s -p 3003
7356 pts/5    Sl+    0:09   2   0.9 /usr/bin/ruby1.9.1 script/rails s -p 3002
7846 pts/3    Sl+    0:19   2   1.7 /usr/bin/ruby1.9.1 script/rails s

然后杀死服务器:

kill -9 <pid>

要杀死名称中带有“rails”的所有正在运行的应用程序:

killall -9 rails
于 2013-10-15T07:25:10.563 回答
1

使用 rails 默认命令,例如:

rake tmp:clear

对我有用,而且非常简单。;)

于 2014-01-14T12:31:23.777 回答
1

单行命令,它将处理它。

kill -9 $(more C:/Rails/tmp/pids/server.pid)
于 2015-06-25T12:52:44.330 回答
0

我刚遇到这个问题,只是删除了 server.pid 文件,服务器工作正常!

于 2013-09-10T21:25:54.193 回答
0

删除该文件:C:/Rails/tmp/pids/server.pid

于 2013-10-15T05:14:11.983 回答
0

一种更简单的方法,我发现较少的命令。转到显示服务器正在您的文件夹结构中运行的路径。搜索文件。在文件本身上显示一个数字,它是当前正在运行的进程 ID。假设数字是“x”,那么只需在终端中输入此命令

kill -9 x

但是,请注意这适用于 Ubuntu。不确定,如果它也适用于其他操作系统。

于 2015-02-16T05:02:06.503 回答
-1

尝试将pid文件中的数字更改为另一个并保存。

于 2013-05-16T18:25:15.653 回答