成功执行后,我的nodejs脚本没有自行退出

Vic*_*ant 26 mysql scripting solr node.js

我从db表和solr读取数据后编写了一个脚本来更新我的db表.我正在使用asyn.waterfall模块.问题是成功完成所有操作后脚本不会退出.我已经使用了数据库连接池,也认为可能会创建无限期等待的脚本.我想把这个脚本放在crontab中,如果它不能正常退出,它将不必要地创建大量的实例.

The*_*der 46

我刚刚解决了这个问题.

刚刚使用的问题process.exit()是我正在处理的程序是创建句柄,但从不破坏它们.

它正在处理目录并将数据放入orientdb.

所以我要学习的一些事情是在删除引用之前需要关闭数据库连接.这process.exit()并不能解决所有情况.

当我的项目处理了2,000个文件.它会下降到大约500左右,额外的句柄将填满可用的工作内存.这意味着它无法继续.因此永远不会到达process.exit最后.

另一方面,如果您关闭请求应用程序保持打开状态的项目,则可以从源头解决问题.

我能够使用的两个"无证函数"是

process._getActiveHandles();
process._getActiveRequests();
Run Code Online (Sandbox Code Playgroud)

我不确定其他哪些函数可以帮助调试这些类型的问题,但这些都很惊人.

它们返回一个数组,您可以使用这些方法确定流程中发生的事情.

我只是希望能帮助其他人绊倒这篇文章.

  • 谢谢,这正是我解决这个问题所需要的.像调用`process.exit();`这样的解决方案是关于你有某种活动事件监听器,超时等的事实......这些函数允许你实际跟踪它们并编写适当的清理代码! (4认同)
  • 我建议使用像[wtfnode](https://github.com/myndzi/wtfnode),[why-is-node-running](https://github.com/mafintosh/why-is-节点运行)或[活动句柄](https://www.npmjs.com/package/active-handles)以确定引起问题的代码段。 (2认同)

awi*_*der 26

通过电话,你必须在完成后告诉它

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

更具体地说,您需要在async.waterfall()(该函数的第二个参数)的回调中调用它.此时,所有异步代码都已执行,您的脚本应该已准备好退出.

编辑:正如下面@Aaron所指出的,这可能与数据库连接处于活动状态,并且不允许节点进程结束有关.

  • 它不是因为异步例程,因为程序`setTimeout(function(){},1000)`在1秒后终止.如果你做异步事情,节点绝对足够聪明,可以告诉你什么时候完成.问题更可能是因为数据库连接(未来事件的可能来源)保持打开状态. (10认同)

小智 7

我们可以使用以下命令退出执行:

connection.destroy();
Run Code Online (Sandbox Code Playgroud)


Kim*_*ern 6

您可以使用节点模块why-is-node-running

1)运行 npm install -D why-is-node-running

2)添加import * as log from 'why-is-node-running';您的代码

3)当您希望程序退出时,添加一条日志语句:

afterAll(async () => {
  await app.close();
  log();
}
Run Code Online (Sandbox Code Playgroud)

这将打印带有堆栈跟踪的打开句柄列表,以找出它们的起源:

There are 5 handle(s) keeping the process running
# Timeout
/home/maf/dev/node_modules/why-is-node-running/example.js:6  - setInterval(function () {}, 1000)
/home/maf/dev/node_modules/why-is-node-running/example.js:10 - createServer()

# TCPSERVERWRAP
/home/maf/dev/node_modules/why-is-node-running/example.js:7  - server.listen(0)
/home/maf/dev/node_modules/why-is-node-running/example.js:10 - createServer()
Run Code Online (Sandbox Code Playgroud)


Tha*_*hai 6

如果您使用 Visual Studio 代码,则可以直接从它附加到已经运行的 Node 脚本

\n\n

首先,运行“调试:附加到节点进程”命令:

\n\n

命令面板的屏幕截图

\n\n

当您调用该命令时,VS Code 将提示您附加到哪个 Node.js 进程:

\n\n

列出节点进程的快速选择视图

\n\n

您的终端应显示此消息:

\n\n
Debugger listening on ws://127.0.0.1:9229/<...>\nFor help, see: https://nodejs.org/en/docs/inspector\nDebugger attached.\n
Run Code Online (Sandbox Code Playgroud)\n\n

调试器侦听 ws://127.0.0.1:9229/0f06c9ce-35c1-4b12-95a8-003882ef97dd / 如需帮助,请参阅:https://nodejs.org/en/docs/inspector / 附加调试器。

\n\n

然后,在调试控制台内,您可以使用The Lazy Coder\xe2\x80\x99s 答案中的代码:

\n\n
process._getActiveHandles();\nprocess._getActiveRequests();\n
Run Code Online (Sandbox Code Playgroud)\n\n

调试控制台

\n