背景
下午收到运维同学的通知,告知测试环境的服务器拉取新代码发版后,启动不了服务。错误日志上,显示错误码 ENOSPC
。
经过一番谷歌后,定位到 ENOSPC
上。
ENOSPC的含义是 Error No more hard-disk space available
(没有更多的磁盘空间可以使用)。最初,怀疑是 /tmp
目录下的文件,耗尽空间。但是,我们的NodeJS服务是通过docker启动的。项目没成功启动,无法进入docker 内删除 /tmp
目录。(很好奇,为什么启动项目会产生这么多临时文件)。
后来看到一段解释
What this command does is to increase the number of watches allowed for a single user. By the default the number can be low (8192 for example). When nodemon tries to watch large numbers of directories for changes it has to create several watches, which can surpass that limit.
错误原因是,nodemon监听文件过多(超过系统允许监听的默认值)导致出现异常。系统默认允许监听文件数为一个较低数值,例如8192。可以通过增加系统允许监听文件数,避免这个报错。结合了项目的启动方式,发现启动时,使用了nodemon进行文件监听。更加肯定错误原因与监听文件过多有关。而且,我们没有给 nodemon
配置过滤规则。因此,会导致监听文件超过默认值。
解决办法
方法一:提高系统允许监听文件数
echo fs.inotify.max_user_watches=524288 | sudo tee -a /etc/sysctl.conf && sudo sysctl -p
方法二:过滤掉不必要的监听的文件
在项目的根目录,创建 nodemon.json
文件,并设置过滤内容。
// nodemon.json
{
"ignore": [
"*.test.js",
"dist/*"
]
}
需要注意的是,nodemon 会默认忽略掉以下类型的文件, .git
, node_modules
, bower_components
, .nyc_output
, coverage
, .sass-cache
。因此,不必将这些类型的文件放入到配置中。