在使用 Node.js 等前端构建工具的时候, watch 总是避免不了的东西,它的作用是热加载,让我们的代码实时更新。
只不过,我们总会遇到类似这样的报错:
1 | Error: EMFILE: too many open files, watch 'path...' |
我们又该怎么办呢?
常规解决办法就是提高可打开的文件数量:
1 | $ ulimit -n [最高数量] |
一般这个数量设置到 10000 就可以了。
如果你出现这种错误:
1 | ulimit: open files: cannot modify limit: Operation not permitted |
那么就要到 /etc/security/limits.conf 这个文件里面在末尾添加一行:
1 | * - nofile [最高数量] |
这里要用 sudo 修改,可以直接使用以下命令:
1 | $ sudo sh -c 'echo "* - nofile [最高数量]" >> /etc/security/limits.conf' |
绝大多数情况到这里就已经解决了,如果你还是出现 too many open files,那么请继续阅读。
只不过有时候我们会发现,这个值设的再大,他也不会解决我们的问题。这时候可能就不是我们项目本身的问题了,可以用这一行语句打印打开文件最多的前 20 个,在这里我们可能发现占用资源的不一定是我们的项目而是其他内容:
1 | $ sudo lsof -u $USER | awk '{print $2, $1}' | sort | uniq -c | sort -rn | head -20 |
例如我这里,就是因为之前做的小项目开了无头没有释放,导致占用过多资源:
1 | 422 2424591 chrome |
这时候有两种办法杀掉,如果你确定这一个应用的所有内容都可以关闭,可以使用这个方法:
1 | $ sudo pkill [进程] |
这里的进程是进程名称例如 chrome 不是 PID,当然,如果是个别特别占用,那这个更好:
1 | $ sudo kill -9 [PID] |
PID 就是刚刚显示的一行中第二列的那个数字,建议粘贴。
这就是针对于我遇到的所有关于 watch 的问题处理方式了,如果你想看你现在的所有进程打开的文件数量总和,这里补充一行命令:
1 | $ sudo lsof -u $USER | wc -l |
如果您还有疑问,请私信我,谢谢。
--- 本文结束 The End ---