【问题标题】:stop all instances of node.js server停止 node.js 服务器的所有实例
【发布时间】:2019-04-25 19:38:47
【问题描述】:

这是我第一次使用 Node.js,我遇到了这个问题:

我已经通过 IDE 的插件启动了一个 Node 服务器。不幸的是,我不能使用 IDE 的终端。所以我尝试从命令行运行脚本。

这是问题所在 - 我正在使用 Express 模块,而我的应用正在侦听某个端口 (8080)。当我从命令行启动应用程序时,它会抛出此错误:

events.js:71
    throw arguments[1]; // Unhandled 'error' event
                   ^
Error: listen EADDRINUSE
    at errnoException (net.js:770:11)
    at HTTPServer.Server._listen2 (net.js:910:14)
    at listen (net.js:937:10)
    at HTTPServer.Server.listen (net.js:986:5)
    at Object.<anonymous> (C:\xampp\htdocs\node\chat\app.js:5:5)
    at Module._compile (module.js:449:26)
    at Object.Module._extensions..js (module.js:467:10)
    at Module.load (module.js:356:32)
    at Function.Module._load (module.js:312:12)
    at Module.runMain (module.js:492:10)

尽管我不太确定这个错误可能是什么,但我认为这是因为应用程序正在侦听一个已经在使用的端口。所以我做了:

netstat -an

我可以看到

TCP    0.0.0.0:8080           0.0.0.0:0              LISTENING

这是因为当我尝试从 IDE 启动 Node 服务器时,它已经启动了。

所以我想知道,如何停止所有服务器实例?另外,如果您能告诉我如何检测端口上正在运行的内容并杀死它。

【问题讨论】:

  • 对不起,我没有提到我在 Windows 环境中。请发布相关的命令。谢谢
  • 您也可以在 Windows 任务管理器中找到 node.js 任务。找到名称为 Node.js:Server-side 的进度...并打开它的详细信息,您将找到您的 nodejs 进度的 pid 和详细信息
  • 这是为我工作的:superuser.com/questions/1183057/…

标签: javascript windows node.js express port


【解决方案1】:

适用于 Linux、OS X

killall node

【讨论】:

  • 简单的方法,但如果任何其他应用程序正在运行,那么我们必须更具体。
  • 对我不起作用。 node: no process found 另外,当我 grep 查找在特定端口上运行的节点进程时,进程 ID 有 - 而不是数字本身。
【解决方案2】:

由于您指定了 Windows。如果您想将其包含在 bat 文件中,您可能不希望它在进程未运行时生成错误。

所以,为了防止“错误:找不到进程“node.exe”。”,您可以添加一个过滤器:

TASKKILL /F /IM node.exe /FI "PID gt 0"

【讨论】:

    【解决方案3】:

    Windows 机器:

    需要杀死一个 Node.js 服务器,并且您没有任何其他 Node 进程正在运行,您可以告诉您的机器杀死所有名为 node.exe 的进程。看起来像这样:

    taskkill /im node.exe
    

    如果进程仍然存在,您可以通过添加/f 标志来强制终止进程:

    taskkill /f /im node.exe
    

    如果您需要更细粒度的控制并且只需要杀死在特定端口上运行的服务器,您可以使用netstat 找到进程ID,然后向其发送终止信号。因此,在您的情况下,端口为8080,您可以运行以下命令:

    C:\>netstat -ano | find "LISTENING" | find "8080"
    

    输出的第五列是进程ID:

      TCP    0.0.0.0:8080           0.0.0.0:0              LISTENING       14828
      TCP    [::]:8080              [::]:0                 LISTENING       14828
    

    然后您可以使用taskkill /pid 14828 终止该进程。如果进程拒绝退出,那么只需在命令中添加/f(强制)参数即可。


    MacOS 机器:

    过程几乎相同。您可以杀死机器上运行的所有 Node 进程:

    killall node
    

    或者也如在@jacob-groundwater's answer below 中提到的使用lsof,您可以找到侦听端口的进程的PID(传递-i 标志和端口以显着加快速度):

    $ lsof -Pi :8080
    COMMAND   PID      USER   FD   TYPE             DEVICE SIZE/OFF NODE NAME
    node     1073    urname   22u  IPv6  bunchanumbershere      0t0  TCP *:8080 (LISTEN)
    

    在这种情况下,进程 ID 是 PID 列下方的数字,然后您可以将其传递给 kill 命令:

    $ kill 1073
    

    如果进程拒绝退出,那么只需使用-9 标志,这是一个SIGTERM,不能忽略:

    $ kill -9 1073
    

    Linux 机器:

    同样,该过程几乎相同。您可以杀死机器上运行的所有 Node 进程(如果 SIGKILL 不足,请使用 -$SIGNAL):

    killall node
    

    或者也可以使用netstat,可以找到监听某个端口的进程的PID:

    $ netstat -nlp | grep :8080
    tcp        0      0 0.0.0.0:8080         0.0.0.0:*                   LISTEN      1073/node
    

    在这种情况下,进程 ID 是第六列中进程名称之前的数字,然后您可以将其传递给 kill 命令:

    $ kill 1073
    

    如果进程拒绝退出,那么只需使用-9 标志,这是一个SIGTERM,不能忽略:

    $ kill -9 1073
    

    【讨论】:

    • 对不起,我究竟如何使用这些命令? process.exit() 可能在代码中?但服务器已经启动。它很可能是使用命令 node app.js 而不是 node-dev app.js 启动的。并且“node killall”不起作用。我做错了吗?谢谢
    • process.exit() 在您的应用程序中导致 NodeJS 实例关闭。 bash 中的killall node 会杀死您机器上运行的所有 NodeJS 实例。
    • 感谢@hexacyanide。我正在Windows上开发。这是否会使 killall node 成为无效命令,因为我无法从命令行使用它。
    • 试试taskkill /IM node.exe。它将杀死所有名为 node.exe 的进程。
    • 我必须使用 taskkill /F /IM node.exe 才能让它工作,谢谢!
    【解决方案4】:

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

    1. 打开任务管理器,寻找这个进程:

    2. 然后只需右键单击并“结束任务”即可。

    3. 就是这样,现在所有的 npm 命令都从头开始运行。

    【讨论】:

      【解决方案5】:

      如果你想杀死特定的节点进程,你可以去命令行路由并输入:

      ps aux | grep node
      

      获取所有节点进程ID的列表。现在你可以得到你的进程id(pid),然后 做:

      kill -9 PID
      

      如果你想杀死所有节点进程然后这样做:

      killall -9 node
      

      -9 开关类似于 Windows 上的结束任务。它将迫使该过程结束。 你可以这样做:

      kill -l
      

      查看 kill 命令的所有开关及其 cmets。

      【讨论】:

        【解决方案6】:

        在 Windows 10 中运行良好

        taskkill /f /im node.exe
        

        【讨论】:

          【解决方案7】:

          Linux

          为了打动你的朋友

          ps aux | grep -i node | awk '{print $2}' | xargs  kill -9
          

          但这是你会记得的一个

          killall node
          

          【讨论】:

            【解决方案8】:

            你可以试试

            killall node
            

            你也可以试试

            killall nodejs
            

            【讨论】:

            • 这些命令已经发布过多次。可以再次发布它们,但是您至少应该在您的答案中添加更多解释,以便其他人可以从中学习
            【解决方案9】:

            多平台、稳定、最佳解决方案:

            使用 fkill 杀死占用你端口的进程:

            fkill -f :8080
            

            安装 fkill 使用命令:npm i -g fkill

            【讨论】:

            • 谢谢大流士。对于 2021 年遇到此问题的任何人,请联系 npm i -g fkill-cli
            【解决方案10】:

            在 windows 命令中 键入命令打击:

            taskkill /f /im node.exe

            【讨论】:

              【解决方案11】:

              使用以下命令从批处理文件中杀死并重新启动节点服务器

                  @echo off
              cd "D:\sam\Projects\Node"
              taskkill /IM node.exe -F
              start /min cmd /C "node index.js"
              goto :EOF
              

              【讨论】:

                【解决方案12】:

                Windows 和 GitBash 终端 我需要在 Windows / Webstorm / GitBash 终端中使用这个命令

                cmd "/C TASKKILL /IM node.exe /F"
                

                【讨论】:

                • 这个是为我做的。谢谢
                • 这个也是为我做的。我发现它是杀死 Windows 上所有节点进程的最快方法。
                【解决方案13】:

                按 cmd 或 bash : Ctrl + C

                【讨论】:

                • 这仅适用于节点进程运行的终端视图,也不保证终止进程。
                【解决方案14】:

                我正在使用 windows 操作系统。

                我杀死了所有节点进程并重新启动了它工作的应用程序。

                试试

                taskkill /im node.exe
                

                【讨论】:

                  【解决方案15】:

                  你也可以试试:

                  killall nodejs

                  【讨论】:

                    【解决方案16】:

                    您可以使用lsof获取已绑定到所需端口的进程。

                    不幸的是,标志似乎因系统而异,但在 Mac OS X 上您可以运行

                    lsof -Pi | grep LISTEN
                    

                    例如,在我的机器上,我得到如下内容:

                    mongod     8662 jacob    6u  IPv4 0x17ceae4e0970fbe9      0t0  TCP localhost:27017 (LISTEN)
                    mongod     8662 jacob    7u  IPv4 0x17ceae4e0f9c24b1      0t0  TCP localhost:28017 (LISTEN)
                    memcached  8680 jacob   17u  IPv4 0x17ceae4e0971f7d1      0t0  TCP *:11211 (LISTEN)
                    memcached  8680 jacob   18u  IPv6 0x17ceae4e0bdf6479      0t0  TCP *:11211 (LISTEN)
                    mysqld     9394 jacob   10u  IPv4 0x17ceae4e080c4001      0t0  TCP *:3306 (LISTEN)
                    redis-ser 75429 jacob    4u  IPv4 0x17ceae4e1ba8ea59      0t0  TCP localhost:6379 (LISTEN)
                    

                    第二个数字是 PID,他们正在侦听的端口位于“(LISTEN)”之前的右侧。找到流氓PID和kill -9 $PID以极端偏见终止。

                    【讨论】:

                    • 嗨 Jacob,请您编辑答案并添加 windows 版本,因为我正在 windows 上开发。谢谢
                    • 我不知道如何在 Windows 上执行此操作,对不起 Kiran。
                    • 这是一个很好的答案,尤其是当多个节点服务器在不同的端口上运行时。我可以轻松区分每个端口上运行的进程 ID。
                    • lsof cmd 无法识别。
                    【解决方案17】:

                    你可以试试这个:

                    taskkill /IM node.exe -F
                    

                    【讨论】:

                      猜你喜欢
                      • 2013-05-26
                      • 2017-06-14
                      • 1970-01-01
                      • 1970-01-01
                      • 1970-01-01
                      • 1970-01-01
                      • 2012-11-27
                      • 1970-01-01
                      相关资源
                      最近更新 更多