对于 watch 的 too many open files 的更多处理
发布于: 2025-10-12 更新于: 2025-11-16 分类于:  作者: twyeottk 阅读次数: 

在使用 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
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
422 2424591 chrome
416 2421044 chrome
403 2416718 chrome
403 2414062 chrome
382 2103507 chrome
380 2410044 chrome
380 2319456 chrome
380 2308663 chrome
380 2305310 chrome
380 2294034 chrome
380 2289708 chrome
380 2286766 chrome
380 2281471 chrome
380 2276302 chrome
380 2267257 chrome
380 2266080 chrome
380 2262684 chrome
380 2258141 chrome
380 2256344 chrome
380 2250496 chrome

这时候有两种办法杀掉,如果你确定这一个应用的所有内容都可以关闭,可以使用这个方法

1
$ sudo pkill [进程]

这里的进程是进程名称例如 chrome 不是 PID,当然,如果是个别特别占用,那这个更好:

1
$ sudo kill -9 [PID]

PID 就是刚刚显示的一行中第二列的那个数字,建议粘贴。


这就是针对于我遇到的所有关于 watch 的问题处理方式了,如果你想看你现在的所有进程打开的文件数量总和,这里补充一行命令:

1
$ sudo lsof -u $USER | wc -l

如果您还有疑问,请私信,谢谢。

--- 本文结束 The End ---