从命令行停止node.js程序

Ele*_*ist 293 command node.js

我有一个简单的TCP服务器,可以监听端口.

var net = require("net");

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

server.listen(7777);
Run Code Online (Sandbox Code Playgroud)

我启动它,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)
Run Code Online (Sandbox Code Playgroud)

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

Bra*_*rad 381

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

另见:https: //superuser.com/a/262948/48624

  • `Ctrl + C`对我不起作用.只有`^ C`被输入控制台,程序不会退出. (19认同)
  • @Eleeist,你用什么作为终端?这对我很有效。 (2认同)
  • @Eleeist,你可能已经重新映射了你的钥匙或其他东西.`Ctrl + C`工作正常.无论如何,这是一个与你真正问题不同的问题.您应该在SuperUser.com上发布"Ctrl + C无效"问题. (2认同)

Jam*_*son 314

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

Ctrl+ C实际上会杀了它.

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

ps aux | grep node
Run Code Online (Sandbox Code Playgroud)

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

kill -9 PROCESS_ID
Run Code Online (Sandbox Code Playgroud)

这也可行

killall node
Run Code Online (Sandbox Code Playgroud)

  • 小心killall节点,如果匹配"节点",你可能会杀死你不想杀死的进程 (7认同)
  • 您可能想在答案中向上移动“killall node”,因为这确实是最简单、最可靠的选项(只要您同意杀死所有实例) (5认同)
  • 'killall'未被识别为内部或外部命令,可操作程序或批处理文件.我错过了什么吗? (4认同)

Ham*_*oli 37

或者您也可以在一行中完成所有这些操作:

kill -9 $(ps aux | grep '\snode\s' | awk '{print $2}')
Run Code Online (Sandbox Code Playgroud)

您可以将'\ snode\s'中的节点替换为任何其他进程名称.

  • 那时,你可以使用`killall`. (4认同)
  • 或者,您可以随时尝试:ps -ef | grep"node"| awk'{print $ 2}'| xargs kill -9 (2认同)

sun*_*304 22

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

  • 这假设你开始时是**REPL**.如果我运行Node脚本怎么办? (2认同)

Met*_*her 19

恢复并终止进程:

Ctrl+ Z暂停它,这意味着它仍然作为暂停的后台进程运行.

你很可能现在在终端提示...

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

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


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

(注意:以下命令可能需要root,sudo ...你的朋友也是如此)

pkill -9 node
Run Code Online (Sandbox Code Playgroud)

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

killall node
Run Code Online (Sandbox Code Playgroud)

或许这个:

kill $(ps -e | grep node | awk '{print $1}')
Run Code Online (Sandbox Code Playgroud)

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

kill $(ps -e | grep dmn | awk '{print $2}')
Run Code Online (Sandbox Code Playgroud)

.


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


小智 18

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

Ctrl+ C将收回>提示然后键入:

process.exit()
Run Code Online (Sandbox Code Playgroud)

或者只是使用Ctrl+ D.


Max*_*mov 17

$ sudo killall node在另一个终端在Mac上killall node工作,而不工作:

$ killall node
No matching processes belonging to you were found
Run Code Online (Sandbox Code Playgroud)


Jas*_*son 12

在linux上试试: pkill node

在Windows上:

Taskkill /IM node.exe /F
Run Code Online (Sandbox Code Playgroud)

要么

from subprocess import call

call(['taskkill', '/IM', 'node.exe', '/F'])
Run Code Online (Sandbox Code Playgroud)


小智 8

您可以使用fuser来完成您想要完成的工作。

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

fuser <<target_port>>/tcp
Run Code Online (Sandbox Code Playgroud)

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

fuser 8888/tcp
Run Code Online (Sandbox Code Playgroud)

终止在端口上运行的进程,只需添加 -k 开关。

fuser <<target_port>>/tcp -k
Run Code Online (Sandbox Code Playgroud)

示例(端口为 8888):

fuser 8888/tcp -k
Run Code Online (Sandbox Code Playgroud)

就是这样!它将关闭监听端口的进程。我通常在运行我的服务器应用程序之前这样做。


Ank*_*hbm 6

您可以使用以下命令来特定于 localserver kill(here: 8000)

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

$:lsof -i tcp:8000
Run Code Online (Sandbox Code Playgroud)

它将为您提供以下 TCP 组:

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

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

$:kill -9 21521
Run Code Online (Sandbox Code Playgroud)

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


小智 5

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

require('child_process').exec(`kill -9 ${pid}`)
Run Code Online (Sandbox Code Playgroud)

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


ran*_*ing 5

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

通过接收.exit命令作为输入,用户按<ctrl>-C两次以向SIGINT发信号或通过按<ctrl>-D以在输入流中发信号指示“结束” 而退出REPL时,将发出“退出”事件。侦听器回调不带任何参数而被调用。

因此,总结一下,您可以退出:

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


Dec*_*ded 5

我要添加这个答案,因为对于许多具有生产部署的项目,我们有停止这些过程的脚本,因此我们不必这样做。

一种管理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

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


小智 5

对于 MacOS

  1. 打开终端
  2. 运行下面的代码并按回车键

     sudo kill $(sudo lsof -t -i:4200)
    
    Run Code Online (Sandbox Code Playgroud)