mysql 我的nodejs脚本在成功执行后未自行退出

iovurdzv  于 2022-12-26  发布在  Mysql
关注(0)|答案(5)|浏览(212)

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

krugob8w

krugob8w1#

我刚看过这一期。
只使用process.exit()的问题是,我正在使用的程序创建句柄,但从未销毁它们。
它正在处理一个目录并将数据放入 orientdb
所以我学到的一些东西是,在删除引用之前,需要关闭数据库连接,而process.exit()并不能解决所有情况。
当我的项目处理2,000个文件时。它会减少到剩下大约500个,额外的句柄会填满可用的工作内存。这意味着它将无法继续。因此永远不会到达最后的process.exit
另一方面,如果您关闭了请求应用保持打开状态的项目,则可以从源头解决问题。
我能够使用的两个“未记录的函数”是

process._getActiveHandles();
process._getActiveRequests();

我不确定还有什么其他的函数可以帮助调试这些类型的问题,但是这些函数太棒了。
它们返回一个数组,通过使用这些方法,您可以确定流程中正在发生的许多事情。

smdnsysy

smdnsysy2#

你必须告诉它当你做了,通过打电话

process.exit();

更具体地说,你需要在async.waterfall()(该函数的第二个参数)的回调函数中调用这个函数,此时,所有的异步代码都已经执行完毕,脚本应该可以退出了。
编辑:正如下面的@Aaron所指出的,这可能与数据库连接处于活动状态,不允许节点进程结束有关。

dxxyhpgq

dxxyhpgq3#

可以使用节点模块why-is-node-running
1.运行npm install -D why-is-node-running
1.在代码中添加import * as log from 'why-is-node-running';
1.当您希望程序退出时,添加一条log语句:

afterAll(async () => {
  await app.close();
  log();
})

这将打印一个打开句柄的列表,并使用stacktrace查找它们的来源:

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()
aelbi1ox

aelbi1ox4#

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

connection.destroy();
cetgtptt

cetgtptt5#

如果使用Visual Studio代码,则可以直接从该代码附加到已运行的Node脚本
首先,运行调试:附加到节点进程命令:

调用该命令时,VS代码将提示您要连接到哪个Node.js进程:

您的终端应显示以下消息:

Debugger listening on ws://127.0.0.1:9229/<...>
For help, see: https://nodejs.org/en/docs/inspector
Debugger attached.

然后,在调试控制台中,可以使用The Lazy Coder’s answer中的代码:

process._getActiveHandles();
process._getActiveRequests();

相关问题