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

nar*_*uen 5 node.js windows-10

我使用node.js(win10 + linux mount)

每次在node.js编译时(或在comp大约3分钟后)都会出现错误。

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

node.js进程之后的消息很难被杀死(bash killall无法正常工作,因此我通过Windows任务管理器杀死了节点进程)

有什么问题?我找不到来自Google的任何答案。

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)
Run Code Online (Sandbox Code Playgroud)

Rob*_*dle 1

这个bug有很多层。首先,您正在 Windows Linux Subsystem 1.x 容器中运行。WSL 1.x 容器都缺少/proc. 中丢失的“文件”/proc并不是真正丢失的文件,而是实际上 Linux 内核如何公开获取进程信息的句柄。

其次,node.js 构建于libuv之上,当调用/proc/self/stat内置的 Node 方法时,它依赖于获取有关当前内存使用情况(RSS)的一些信息。process.memoryUsage

相关调用的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);
Run Code Online (Sandbox Code Playgroud)

最后,yarn尝试执行process.memoryUsage()以监视构建期间的内存使用情况并将其报告给 CLI。不幸的是,由于/proc/self/statWSL 1.x 中缺少该条目之一,libuv 无法找到该“文件”,并且进程崩溃并显示此相对模糊的错误消息。

好的一面是,我刚刚检查了一个使用 WSL 2.0 作为 docker 后端运行 Debian 的 docker 容器,看来 WSL 现在正确地公开了/proc/self/stat. 只是为了确认我在该容器中运行了节点并且执行process.memoryUsage()不再导致崩溃。