错误:ENOENT:没有这个文件或目录,uv_resident_set_memory

10

我使用node.js(win10 + linux挂载)

每次编译node.js时都会出现错误(或者在编译前约3分钟左右的时间内)。

错误:ENOENT:没有此类文件或目录,uv_resident_set_memory

在node.js处理后的信息很难终止(bash的killall无法工作,所以我通过Windows任务管理器杀死了进程)。

问题出在哪里?我在谷歌上找不到任何答案。

internal/process.js:103
    memoryUsage_(memValues);
    ^

Error: ENOENT: no such file or directory, uv_resident_set_memory
    at process.memoryUsage (internal/process.js:103:5)
    at ConsoleReporter.checkPeakMemory (/home/naruen/.nvm/versions/node/v8.11.3/lib/node_modules/yarn/lib/cli.js:34148:40)
    at Timeout._onTimeout (/home/naruen/.nvm/versions/node/v8.11.3/lib/node_modules/yarn/lib/cli.js:34141:13)
    at ontimeout (timers.js:498:11)
    at Timer.unrefdHandle (timers.js:611:5)

有人解决了这个问题吗?我在我的Ubuntu服务器上也遇到了同样的问题。 - Ian Jay
1个回答

1
这个bug有多个层面。首先,你在运行Windows Linux子系统1.x容器。WSL 1.x容器中/proc缺少一些条目。在/proc中缺失的“文件”实际上不是真正缺失的文件,而只是Linux内核公开用于获取进程信息句柄的方式。
其次,node.js是基于libuv构建的,依赖于/proc/self/stat来获取有关调用内置节点方法process.memoryUsage时当前内存使用情况(RSS)的一些信息。
相关调用的libuv源代码
int uv_resident_set_memory(size_t* rss) {
  char buf[1024];
  const char* s;
  ssize_t n;
  long val;
  int fd;
  int i;

  do
    fd = open("/proc/self/stat", O_RDONLY);
  while (fd == -1 && errno == EINTR);

最后,yarn 正在尝试执行 process.memoryUsage() 来监视构建期间的内存使用情况并将其报告给 CLI。不幸的是,由于 /proc/self/stat 是 WSL 1.x 中缺失的条目之一,libuv 找不到该“文件”,进程会崩溃并显示相对模糊的错误消息。
好消息是,我刚刚检查了一个运行 Debian 的 docker 容器,使用 WSL 2.0 作为 docker 后端,看起来 WSL 现在正确地公开了 /proc/self/stat。只是为了确认,我在该容器中运行了 node,并执行 process.memoryUsage(),不再导致崩溃。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接