从命令行停止node.js程序

时间:2012-05-09 19:05:40

标签: node.js command

我有一个侦听端口的简单TCP服务器。

var net = require("net");

var server = net.createServer(function(socket) {
    socket.end("Hello!\n");
});

server.listen(7777);

我用node server.js启动它,然后在Mac上用Ctrl + Z关闭它。当我尝试使用node server.js再次运行时,我收到以下错误消息:

node.js:201
        throw e; // process.nextTick error, or 'error' event on first tick
          ^
Error: listen EADDRINUSE
at errnoException (net.js:670:11)
at Array.0 (net.js:771:26)
at EventEmitter._tickCallback (node.js:192:41)

我以错误的方式关闭程序吗?我怎样才能防止这种情况发生?

19 个答案:

答案 0 :(得分:366)

要结束该程序,您应该使用 Ctrl + C 。如果你这样做,它会发送SIGINT,它允许程序正常结束,从正在监听的任何端口解除绑定。

另请参阅:https://superuser.com/a/262948/48624

答案 1 :(得分:302)

Ctrl + Z 暂停它,这意味着它仍然可以正在运行。

Ctrl + C 实际上会将其删除。

你也可以像这样手动杀死它:

ps aux | grep node

找到进程ID(左起第二个):

kill -9 PROCESS_ID

这可能也有效

killall node

答案 2 :(得分:34)

或者你可以在一行中完成所有这些:

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

您可以替换' \ snode \ s'内的节点。与任何其他进程名称。

答案 3 :(得分:21)

您可以键入.exit以退出节点js REPL

答案 4 :(得分:18)

如果您以交互方式运行Node.js(REPL):

Ctrl + C 会将您带回>提示然后输入:

process.exit()

或只使用 Ctrl + D

答案 5 :(得分:16)

另一个终端中的

$ sudo killall node适用于 mac ,而killall node无效:

$ killall node
No matching processes belonging to you were found

答案 6 :(得分:15)

恢复并终止进程:

Ctrl+Z suspends it, which means it is still running as a suspended background process.

您现在可能处于终端提示符...

  1. 命令fg恢复前台进程。

  2. 输入 Ctrl + C 以正确杀死它。

  3. 或者,你可以像这样手动杀死它:

    注意:以下命令可能需要root,因此sudo ...是您的朋友)

    pkill -9 node
    

    或者,如果你没有pkill,这可能会有效:

    killall node
    

    或者也许这样:

    kill $(ps -e | grep node | awk '{print $1}')
    

    有时候流程会列出自己的grep,在这种情况下你需要:

    kill $(ps -e | grep dmn | awk '{print $2}')
    

    h / t @ruffin来自对问题本身的评论。我有同样的问题,他的评论帮助我自己解决了。

答案 7 :(得分:7)

在Linux上尝试:pkill node

在Windows上:

Taskkill /IM node.exe /F

from subprocess import call

call(['taskkill', '/IM', 'node.exe', '/F'])

答案 8 :(得分:4)

虽然这是一个迟到的答案,但我从NodeJS docs找到了这个:

  

当退出REPL时,通过接收.exit命令作为输入,用户按<ctrl>-C两次以发出SIGINT信号,或按<ctrl>-D来发出'exit'事件输入流上的信号'结束'。在没有任何参数的情况下调用侦听器回调。

总而言之,您可以退出:

  1. 在nodejs REPL。
  2. 中键入.exit
  3. 按两次<ctrl>-C
  4. <ctrl>-D
  5. process.exit(0)表示从REPL自然退出。如果要返回任何其他状态,可以返回非零数字。
  6. process.kill(process.pid)是在代码中或从REPL中使用nodejs api的方法。

答案 9 :(得分:4)

我正在添加这个答案,因为对于许多具有生产部署的项目,我们有脚本可以停止这些流程,所以我们不必这样做。

管理Node Server进程的一种简洁方法是使用forever包(来自NPM)。

实施例

永久安装

npm install forever -g

运行节点服务器

forever start -al ./logs/forever.log -ao ./logs/out.log -ae ./logs/err.log server.js

结果:

info: Forever processing file: server.js

关闭节点服务器

forever stop server.js

结果

info: Forever stopped process: uid command script forever pid id logfile uptime [0] sBSj "/usr/bin/nodejs/node" ~/path/to/your/project/server.js 23084 13176 ~/.forever/forever.log 0:0:0:0.247

这将彻底关闭您的服务器应用程序。

答案 10 :(得分:2)

我遇到了运行多节点服务器的问题,我想只杀死其中一个并从脚本重新部署它。

注意:此示例位于Mac上的bash shell中。

为此,我确保尽可能具体地进行node来电。例如,我不是从apps目录中调用node server.js,而是调用node app_name_1/app/server.js

然后我可以使用:

杀死它

kill -9 $(ps aux | grep 'node\ app_name_1/app/server.js' | awk '{print $2}')

这只会终止运行app_name_1 / app / server.js的节点进程。

如果您运行node app_name_2/app/server.js,此节点进程将继续运行。

如果您决定要杀死所有人,可以使用其他人提到的killall node

答案 11 :(得分:2)

最新答案,但在Windows上,使用CTRL + ALT + DEL打开任务管理器,然后杀死Node.js进程将解决此错误。

答案 12 :(得分:2)

如果您想使用npm stop或类似的内容停止服务器。您可以将杀死服务器进程的代码编写为:

require('child_process').exec(`kill -9 ${pid}`)

检查此链接以获取详细信息: https://gist.github.com/dominhhai/aa7f3314ad27e2c50fd5

答案 13 :(得分:1)

对于MacOS

  1. 打开终端
  2. 运行以下代码,然后按Enter键

     sudo kill $(sudo lsof -t -i:4200)
    

答案 14 :(得分:0)

我的用例:在 MacOS 上,通过脚本在不同端口上运行/重新运行多节点服务器

运行"cd $PATH1 && node server1.js & cd $PATH2 && node server2.js & ..."

stop1 "kill -9 $(lsof -nP -i4TCP:$PORT1 | grep LISTEN | awk '{print $2}')"

stop2,stop3 ...

重新运行"stop1 & stop2 & ... & stopN ; run

有关通过端口查找进程的更多信息:Who is listening on a given TCP port on Mac OS X?

答案 15 :(得分:0)

对于Windows,请先使用您的端口号搜索PID

netstat -ano | findStr "portNumber"

然后,终止任务,确保您位于“ c”驱动器enter image description here的根目录中 该命令将为taskkill /F /PID your pid

答案 16 :(得分:0)

您可以按照以下命令工作,以特定于localserver kill(此处为8000)

  

http://localhost:8000/杀死PID(processId):

$:lsof -i tcp:8000

它将为您提供以下TCP组:

  

命令PID用户FD类型设备大小/关闭节点名称

     

节点21521 ubuntu 12u IPv6 345668 0t0 TCP *:8000(听)

$:kill -9 21521

它将杀死对应于TCP *:8000的processId

答案 17 :(得分:0)

您可以使用 fuser 来完成所需的工作。

为了获取在端口上运行的任务的进程ID,您可以执行以下操作:

fuser <<target_port>>/tcp

假设端口为8888,命令将变为:

fuser 8888/tcp

要想杀死在端口上运行的进程,只需添加-k开关即可。

fuser <<target_port>>/tcp -k

示例(端口为8888):

fuser 8888/tcp -k

就是这样!它将关闭在端口上侦听的进程。 我通常在运行服务器应用程序之前执行此操作。

答案 18 :(得分:0)

如果您使用的是VS Code,请先从右侧下拉菜单中选择节点,然后再按Ctrl +C。然后它将起作用

enter image description here

在出现提示时按y。

enter image description here

谢谢

相关问题