Nodemon y ENOSPC: Cuando tu Linux se queda sin vigilantes de archivos

Si te topaste con el error 'System limit for number of file watchers reached' usando Nodemon en Linux, no te preocupes, no eres el único. Es un problema común y tiene una solución directa que te explico acá.

A ver, si estás aquí leyendo esto, lo más probable es que tu terminal te haya escupido algo como ENOSPC: System limit for number of file watchers reached justo cuando intentabas levantar tu proyecto con nodemon. No eres el primero ni el último al que le pasa, esto es un clásico en distros Linux, sobre todo si trabajas con proyectos un poco más grandes o que tienen un montón de dependencias.

El cuento es así de simple: tu sistema operativo tiene un límite en la cantidad de archivos que puede 'vigilar' a la vez para detectar cambios. nodemon, por su parte, necesita justamente eso: vigilar archivos para reiniciarse automáticamente cuando modificas algo. Cuando tu proyecto es muy grande, o tienes muchas dependencias en node_modules, o incluso si tienes varios proyectos abiertos, ese límite se topa, y boom, error ENOSPC. Significa No Space, pero no de espacio en disco, sino de 'espacio' para esos vigilantes de archivos, que en Linux se llaman inotify watchers.

Yo me acuerdo que esto me volvió loco un par de veces. La primera vez pensé que era un problema de nodemon o de mi código, pero no, era algo a nivel de sistema operativo. Es una lata, porque uno quiere enfocarse en el código y te sales con estas configuraciones del kernel.

Para salir de este apuro, lo primero es verificar cuál es el límite actual de tu sistema. Abre tu terminal y ejecuta esto:

cat /proc/sys/fs/inotify/max_user_watches

Esto te va a mostrar un número. En mi caso, usualmente era 8192 o algo por el estilo, que para un proyecto chico va bien, pero para algo más serio, se queda corto al tiro. Si el número es bajo y te da el error ENOSPC, ahí está tu problema.

La solución es aumentar ese límite. Hay dos formas: temporal y permanente. La temporal es útil si solo quieres salir del paso para un rato, pero si trabajas con Node.js regularmente, te recomiendo ir directo a la permanente.

Solución Temporal

Si solo necesitas que funcione ahora y no te importa que se resetee al reiniciar el computador, puedes usar este comando. Ojo que el número 131070 es uno que yo he visto recomendado en varios lados y que a mí me ha funcionado bien la mayoría de las veces. Si con ese número todavía te da el error, puedes probar con el doble, no pasa nada grave por subirlo un poco más.

sudo sysctl fs.inotify.max_user_watches=131070
sudo sysctl -p

El sudo sysctl -p es para que los cambios se apliquen de inmediato. Esto es bueno para probar si el nuevo límite te sirve antes de hacerlo permanente.

Solución Permanente

Esta es la que yo uso y recomiendo. Así te olvidas del problema cada vez que reinicias el sistema. Vas a crear un archivo de configuración para sysctl. Yo prefiero ponerlo en /etc/sysctl.d/ con un nombre descriptivo, como 10-user-watches.conf. El '10-' al principio es una convención para el orden de carga, pero puedes usar '99-' o lo que quieras.

echo "fs.inotify.max_user_watches = 131070" | sudo tee /etc/sysctl.d/10-user-watches.conf

Después de crear ese archivo, necesitas recargar las configuraciones de sysctl para que tome el cambio:

sudo sysctl --system

En sistemas más antiguos, a veces solo basta con sudo sysctl -p, pero el --system es más robusto porque se asegura de cargar todos los archivos de configuración en /etc/sysctl.d/. Una vez hecho esto, tu sistema debería tener un límite mucho más alto y nodemon debería funcionar sin problemas.

La verdad, es una solución simple a un problema que parece más complejo de lo que es. No hay que sobreingenieriar esto. Sube el límite y sigue codificando. Es lo que siempre digo, las soluciones más directas suelen ser las mejores.

Un error común que veo es que la gente sube el límite, le funciona, pero olvida hacerlo permanente. Luego reinician el computador y el error vuelve. Ojo con eso. Otro punto es que algunos, al ver este problema, se complican la vida intentando configurar nodemon para que ignore ciertos directorios. Aunque eso podría servir si el problema es muy específico de un subdirectorio gigante, la mayoría de las veces es más fácil y eficiente subir el límite global del sistema y listo. Si tu proyecto es tan, tan grande que ni con 262140 watchers funciona, ahí quizás es momento de revisar la estructura de tu node_modules o cómo estás usando nodemon.

Jorge RequenaDeveloper full-stack · Chile