【问题标题】:Rails server says port already used, how to kill that process?Rails 服务器说端口已经使用,如何终止该进程?
【发布时间】:2021-05-17 13:35:37
【问题描述】:

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

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

【问题讨论】:

    标签: ruby-on-rails


    【解决方案1】:

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

    $ lsof -wni tcp:3000
    

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

    $ kill -9 PID
    

    【讨论】:

    • 你能解释一下吗-wni
    • 只是为新手澄清一下:在第二行代码中,您应该将PID 替换为输入第一行代码时控制台中显示的实际数字(例如, 12345).
    • 您还可以通过在您的 rails 目录中导航到以下文件 tmp/pids/server.pid 来找到 PID
    • 如果您在 RubyMine 中运行调试器并且它崩溃或其他原因,可能会发生这种情况......服务器停止但调试器继续......无论如何,这是我使用的解决方案并且它工作得很好: )
    • 在 MacOS 上,您也可以在活动监视器中执行此操作,方法是查找“ruby”进程名称并单击 x 图标
    【解决方案2】:

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

    【讨论】:

    • 括号之间的所有内容都将返回一个使用端口 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 会做什么
    • 这应该是公认的答案,因为它是“一体式”行。把它放在一个别名中,你就可以开始了。
    • 如果包含解释,这绝对值得一票。
    • 这将杀死所有进程,包括所有打开的浏览器会话。所以你在尝试的时候要小心。
    • 请参阅我对接受的关于通过死记硬背/习惯性使用kill -9 的答案的评论。
    【解决方案3】:

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

    lsof -i tcp:3000 -t
    

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

    kill -9 pid
    

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

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

    【讨论】:

    • 请参阅我对接受的答案的评论,关于通过死记硬背/习惯性地使用kill -9
    【解决方案4】:

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

    fuser -k 3000/tcp
    

    但正如托比所说,在 Mac OS 中 fuser 的实现相当原始,这个命令在 mac 上不起作用。

    【讨论】:

    • 这在 mac 上不起作用(问题中规定了 Mac),因为 fuser 只接受 c、f 和 u 作为选项。
    • 我已经更新了答案,它还解决了如何为 mac 用户使用它。没有理由拒绝投票,特别是考虑到其他人,包括我自己过去偶然发现了这个问题,尽管没有使用 Mac。
    • 添加-v 标志还会显示少量关于哪个进程被杀死的信息。所以fuser -kv 3000/tcp。可惜 MacOS 的 fuser 没有这个能力。不过,kill $(lsof -ti tcp:3000) 是相当接近的等价物。
    【解决方案5】:

    有时 Rails 服务器可能无法正常关闭。 你可以找到rails使用的进程

    ps 辅助 | 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

    【讨论】:

    • 这对我来说已经变成了“ps aux | grep ruby​​”。也许是从 webrick 到 puma 的转变
    • 请参阅我对接受的答案的评论,关于通过死记硬背/习惯性地使用kill -9
    • 我必须这样做才能找到正确的进程ps aux | grep puma
    【解决方案6】:

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

    gem install shutup

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

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

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

    声明:我是这颗宝石的创造者

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

    rvm @global do gem install shutup
    

    【讨论】:

    • 这很整洁。查看源代码,您的 gem 会查找 pid 文件,但不能保证它存在。 lsof 方法更可靠。
    • @maxpleaner: true,并且更有可能杀死可能正在侦听该端口的其他进程,以防万一(可能是意外)。
    • 它在这里工作。如果你在 2019 年阅读这篇文章,请安装这个 gem,它真的很管用,简单多了.. 只需在你的文件夹中运行 gem install shutup,每次你需要杀死时只需输入“shutup”
    • 我安装了这个 gem,然后运行它,它杀死了 Sinatra。但是,从现在开始,默认端口 4567 不会响应,“set :port XXXX”命令设置的任何其他端口也不会响应。我该如何处理?
    【解决方案7】:

    一线解决方案:

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

    【讨论】:

      【解决方案8】:

      使用这个命令你可以杀死服务器:

      ps aux|grep rails 
      

      【讨论】:

        【解决方案9】:

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

        【讨论】:

          【解决方案10】:

          所以这是一个 WSL 脚本,可以杀死 windows 中的进程

          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
          

          【讨论】:

            【解决方案11】:

            输入:

            man lsof
            

            然后查找 -w、-n 和 -i

            -i:互联网的东西 -n:让它更快 -w:切换警告

            手册页上有更多详细信息

            【讨论】:

              【解决方案12】:

              如果您使用的是 Windows 机器,请按照以下步骤操作。

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

              您将在此处创建一个名为 server.pid 的文件

              删除它。

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

              就是这样。

              编辑: Please refer this

              【讨论】:

              • 这不会停止服务器。
              • 虽然此代码可能有助于解决问题,但提供有关 why 和/或 如何 回答问题的附加上下文(特别是,为什么您认为对 Windows 机器的建议可能对说明它在 MacOS 上的问题有用)会显着提高其长期价值。请edit你的答案添加一些解释。
              猜你喜欢
              • 1970-01-01
              • 2018-02-11
              • 2019-05-26
              • 2021-12-06
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2021-08-03
              • 2014-05-02
              相关资源
              最近更新 更多