我已经写了一个脚本来更新我的数据库表后,从数据库表和solr阅读数据。我正在使用asyn.waterfall模块。问题是,脚本是不是得到退出后,成功完成所有操作。我已经使用数据库连接池也认为,可能是创建脚本等待无限。我想把这个脚本放在crontab中,如果它不能正确退出,它将不必要地创建大量示例。
krugob8w1#
我刚看过这一期。只使用process.exit()的问题是,我正在使用的程序创建句柄,但从未销毁它们。它正在处理一个目录并将数据放入 orientdb。所以我学到的一些东西是,在删除引用之前,需要关闭数据库连接,而process.exit()并不能解决所有情况。当我的项目处理2,000个文件时。它会减少到剩下大约500个,额外的句柄会填满可用的工作内存。这意味着它将无法继续。因此永远不会到达最后的process.exit。另一方面,如果您关闭了请求应用保持打开状态的项目,则可以从源头解决问题。我能够使用的两个“未记录的函数”是
process.exit()
process.exit
process._getActiveHandles(); process._getActiveRequests();
我不确定还有什么其他的函数可以帮助调试这些类型的问题,但是这些函数太棒了。它们返回一个数组,通过使用这些方法,您可以确定流程中正在发生的许多事情。
smdnsysy2#
你必须告诉它当你做了,通过打电话
process.exit();
更具体地说,你需要在async.waterfall()(该函数的第二个参数)的回调函数中调用这个函数,此时,所有的异步代码都已经执行完毕,脚本应该可以退出了。编辑:正如下面的@Aaron所指出的,这可能与数据库连接处于活动状态,不允许节点进程结束有关。
dxxyhpgq3#
可以使用节点模块why-is-node-running:1.运行npm install -D why-is-node-running1.在代码中添加import * as log from 'why-is-node-running';1.当您希望程序退出时,添加一条log语句:
npm install -D why-is-node-running
import * as log from 'why-is-node-running';
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()
aelbi1ox4#
我们可以使用以下命令退出执行:
connection.destroy();
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中的代码:
5条答案
按热度按时间krugob8w1#
我刚看过这一期。
只使用
process.exit()
的问题是,我正在使用的程序创建句柄,但从未销毁它们。它正在处理一个目录并将数据放入 orientdb。
所以我学到的一些东西是,在删除引用之前,需要关闭数据库连接,而
process.exit()
并不能解决所有情况。当我的项目处理2,000个文件时。它会减少到剩下大约500个,额外的句柄会填满可用的工作内存。这意味着它将无法继续。因此永远不会到达最后的
process.exit
。另一方面,如果您关闭了请求应用保持打开状态的项目,则可以从源头解决问题。
我能够使用的两个“未记录的函数”是
我不确定还有什么其他的函数可以帮助调试这些类型的问题,但是这些函数太棒了。
它们返回一个数组,通过使用这些方法,您可以确定流程中正在发生的许多事情。
smdnsysy2#
你必须告诉它当你做了,通过打电话
更具体地说,你需要在async.waterfall()(该函数的第二个参数)的回调函数中调用这个函数,此时,所有的异步代码都已经执行完毕,脚本应该可以退出了。
编辑:正如下面的@Aaron所指出的,这可能与数据库连接处于活动状态,不允许节点进程结束有关。
dxxyhpgq3#
可以使用节点模块why-is-node-running:
1.运行
npm install -D why-is-node-running
1.在代码中添加
import * as log from 'why-is-node-running';
1.当您希望程序退出时,添加一条log语句:
这将打印一个打开句柄的列表,并使用stacktrace查找它们的来源:
aelbi1ox4#
我们可以使用以下命令退出执行:
cetgtptt5#
如果使用Visual Studio代码,则可以直接从该代码附加到已运行的Node脚本。
首先,运行调试:附加到节点进程命令:
调用该命令时,VS代码将提示您要连接到哪个Node.js进程:
您的终端应显示以下消息:
然后,在调试控制台中,可以使用The Lazy Coder’s answer中的代码: