【发布时间】:2021-08-28 09:11:39
【问题描述】:
PM2(版本 5.1.0)pm2.delete(process, errback) 函数有一个非常烦人的问题。经过两天的调试,试图找到问题的根源,它开始看起来像是与PM2库本身有关的问题。
这是我正在做的简化代码 sn-p。之后我会解释这个问题。
const debug = require("debug")("...");
const pm2 = require("pm2");
const Database = require("./Database");
...
class Backend {
static cleanup() {
return new Promise((resolve, reject) => {
pm2.connect((error) => {
if (error) {
debug("...");
reject();
return;
}
// MongoDB query and async forEach iteration
Database.getCollection("...").find({
...
})
.forEach((document) => {
pm2.delete("service_...", (error, process) => {
if (!error && process[0].pm2_env.status === "stopped") {
debug("...");
} else {
debug("...");
}
});
})
.catch(...)
.then(...);
}
});
}
...
}
现在的问题是:我的进程没有被终止,pm2.delete(process, errback) 中的errback 根本没有执行。
- 我打印了连接回调的错误参数,它总是
null,因此与PM2的连接成功建立 - 我将调试文本直接放在删除回调的开头,它没有打印出来
- 我将删除函数包装在一个 while 循环中,只有在删除回调至少执行一次并且循环永远运行时才会停止
- 我开始了一个调试会话,注意到
node_modules/pm2/lib/API.js(第 533 行)中 PM2 的删除函数被调用,但由于某种原因,该进程没有终止,并且我提供的回调函数根本没有执行(我通过在调试模式下逐步执行命令,但仍然无法判断它在哪里执行回调失败(虽然它似乎发生在 PM2 的 API.js 中)) - 我还注意到,在调试模式下逐步运行代码时,如果我在中间的某个点取消执行,有时我的进程会因 API 调用而终止(但是,回调仍未执行)
- 我也在我的软件的另一个地方使用了 PM2 的删除功能,它的工作就像一个魅力
所以由于某种原因,pm2.delete(process, errback) 没有正确执行,我现在不知道该怎么做。是否有人对 PM2 的源代码有经验或在某些时候遇到过类似的问题?任何建议都会有所帮助。
【问题讨论】:
-
也许值得一提的是,我在两台不同的 Windows 10 计算机上具有完全相同的行为。我没有机会在不同的操作系统上部署我的软件。
-
尝试同步运行pm2 delete(每次一个删除操作)
-
感谢您的快速回复!我已经尝试过将删除功能直接放在连接功能的错误检查之后(因此在异步 forEach 之外)。然后我明确定义了进程名称(对所有内容进行了拼写检查),我仍然得到相同的行为。
-
从我的调试中我可以说的是,PM2 的内部函数
_operate在内部函数delete中被调用(在 API.js 中)。我将1495与else if (isNaN(process_name)) {对齐,这在我的情况下是正确的,之后我在调试中失去了轨道。换句话说,调试器不会跳转到我的回调函数中,而是会被完全跳过,即使我尝试单步执行。
标签: javascript node.js pm2