【发布时间】:2018-11-10 22:16:29
【问题描述】:
我有一个创建 web3 websocket 连接的节点 js 进程,如下所示:
web3 = new Web3('ws://localhost:7545')
当进程完成时(我向它发送一个 SIGTERM),它不会退出,而是永远挂起,没有控制台输出。
我在 SIGINT 和 SIGTERM 上注册了一个侦听器,以观察进程在 process._getActiveRequests() 和 process._getActiveHandles() 上的出色处理,我看到了:
Socket {
connecting: false,
_hadError: false,
_handle:
TCP {
reading: true,
owner: [Circular],
onread: [Function: onread],
onconnection: null,
writeQueueSize: 0 },
<snip>
_peername: { address: '127.0.0.1', family: 'IPv4', port: 7545 },
<snip>
}
为了完整起见,下面是监听信号的代码:
async function stop() {
console.log('Shutting down...')
if (process.env.DEBUG) console.log(process._getActiveHandles())
process.exit(0)
}
process.on('SIGTERM', async () => {
console.log('Received SIGTERM')
await stop()
})
process.on('SIGINT', async () => {
console.log('Received SIGINT')
await stop()
})
看起来 web3 正在打开一个套接字,这是有道理的,因为我从未告诉它关闭连接。查看文档和谷歌搜索,看起来 web3 对象没有 close 或 end 方法。
上面stop中手动关闭socket可以让进程成功退出:
web3.currentProvider.connection.close()
谁有更优雅或官方认可的解决方案?我觉得很有趣,您必须手动执行此操作,而不是让对象在进程结束时自行销毁。其他客户端似乎会自动执行此操作,而无需明确告诉他们关闭连接。告诉节点进程创建的所有客户端在关闭时关闭它们的句柄/连接也许更干净,但对我来说,这是出乎意料的。
【问题讨论】:
-
When the process completes是什么意思?您的进程是一个监听端口的 HTTP 服务器。它怎么知道它应该停止倾听? -
抱歉,我不清楚这个过程是如何完成的。我正在向节点进程发送终止信号。 express 和 mongo 似乎会在进程退出时自动关闭句柄,但 web3 不会。
-
它在什么系统上运行?您的进程是否有子进程?
-
debian 杰西。没有孩子
-
Debian 在 Docker 容器中运行,但我认为这无关紧要。
标签: javascript websocket ethereum solidity web3