Власна помилка React: ENOSPC: досягнуто системне обмеження кількості переглядачів файлів


161

Я налаштував нову програму для пустого реагування.

Після установки декількох вузлових модулів я отримав цю помилку.

Running application on PGN518.
internal/fs/watchers.js:173
   throw error;
   ^

Error: ENOSPC: System limit for number of file watchers reached, watch '/home/badis/Desktop/react-native/albums/node_modules/.staging'
   at FSWatcher.start (internal/fs/watchers.js:165:26)
   at Object.watch (fs.js:1253:11)
   at NodeWatcher.watchdir (/home/badis/Desktop/react-native/albums/node modules/sane/src/node watcher. js:175:20)
   at NodeWatcher.<anonymous> (/home/badis/Desktop/react-native/albums/node modules/sane/src/node watcher. js:310:16)
   at /home/badis/Desktop/react-native/albums/node modules/graceful-fs/polyfills.js:285:20
   at FSReqWrap.oncomplete (fs.js:154:5)

Я знаю, що це пов’язано з тим, що сторожу не вистачає місця для перегляду всіх змін файлів.

Я хочу знати, який найкращий спосіб тут діяти?

Чи слід ігнорувати node_modulesпапку, додаючи її .watchmanconfig?


24
НІКОЛИ не публікуйте зображення коду, помилок або вихідних даних! stackoverflow.com/help/how-to-ask
Роб

1
Ви розглядали можливість додати частину коду до зворотного списку metro.config.js? Це повинно зменшити обсяг сканування: stackoverflow.com/questions/41813211 / ...
deepelement

Відповіді:


272

Linux використовує пакет inotify для спостереження за подіями файлової системи, окремих файлів або каталогів.

Оскільки React / Angular гаряче перезавантажує та перекомпілює файли при збереженні, йому потрібно відстежувати всі файли проекту. Збільшення ліміту увімкнення годинника повинно приховувати попереджувальні повідомлення.

Ви можете спробувати редагувати

# insert the new value into the system config
echo fs.inotify.max_user_watches=524288 | sudo tee -a /etc/sysctl.conf && sudo sysctl -p

# check that the new value was applied
cat /proc/sys/fs/inotify/max_user_watches

# config variable name (not runnable)
fs.inotify.max_user_watches=524288

41
Це не пояснює, в чому проблема, що таке рішення або як рішення вирішує проблему.
Native Coder

2
вау, я зіткнувся з подібною проблемою, як написано вище, але це рішення вирішило її на 100%. дякую
akolliy

3
Як нам забрати спостерігачів замість того, щоб дозволити більше?
Джонатан,

2
Працює, але якщо я правильно прочитав, це піднімає межу. Чи можу я замість цього закрити відкритих спостерігачів?
zozo

1
@NativeCoder чи вирішить цю проблему нова редакція?
zardilior

186

Сенс цієї помилки полягає в тому, що кількість файлів, які контролює система, досягла межі !!

Результат: Виконана команда не вдалася! Або викиньте попередження (наприклад, виконайте реалізований на реакцію VSCode)

Рішення:

Змініть кількість файлів системного моніторингу

Ubuntu

sudo gedit /etc/sysctl.conf

Додайте рядок унизу

fs.inotify.max_user_watches=524288

Тоді зберігайте і виходьте!

sudo sysctl -p

щоб перевірити це

Тоді це вирішено!


Гей, це вирішено у моєму випадку. Також поділився в моєму дописі. Дякую
Рашид Хан

Дякую. Це вирішило і моє питання.
Нельсон Катале

Дякую! Це мені допомогло.
WISERDIVISOR

66

Ви можете це виправити, збільшивши кількість сповіщаючих спостерігачів.

Якщо вас не цікавлять технічні деталі, а ви хочете отримати послухати роботу:

  • Якщо ви використовуєте Debian, RedHat або інший подібний дистрибутив Linux, запустіть у терміналі наступне:

    $ echo fs.inotify.max_user_watches=524288 | sudo tee -a /etc/sysctl.conf && sudo sysctl -p

  • Якщо ви використовуєте ArchLinux, замість цього виконайте таку команду

    $ echo fs.inotify.max_user_watches=524288 | sudo tee /etc/sysctl.d/40-max-user-watches.conf && sudo sysctl --system

Потім вставте його у свій термінал і натисніть Enter, щоб запустити.


Технічні деталі

Прослуховування використовує inotify за замовчуванням у Linux для моніторингу каталогів на наявність змін. Нерідко трапляється системне обмеження кількості файлів, які ви можете відстежувати. Наприклад, обмеження запобігання Ubuntu Lucid (64 біт) встановлено на 8192.

Ви можете отримати поточний ліміт перегляду файлів inotify, виконавши:

$ cat /proc/sys/fs/inotify/max_user_watches

Коли цього обмеження недостатньо для моніторингу всіх файлів у каталозі, його слід збільшити, щоб Слухати працювало належним чином.

Ви можете встановити нове обмеження тимчасовим за допомогою:

$ sudo sysctl fs.inotify.max_user_watches=524288
$ sudo sysctl -p

Якщо ви хочете зробити свій ліміт постійним, використовуйте:

$ echo fs.inotify.max_user_watches=524288 | sudo tee -a /etc/sysctl.conf
$ sudo sysctl -p

Можливо, вам також доведеться звернути увагу на значення max_queued_eventsі, max_user_instancesякщо слухати продовжує скаржитися.


2
Вау, велике спасибі, це вирішило мою проблему за подібну помилку з React JS, оскільки мій проект став більшим, але я не міг зрозуміти тонкощів та помилок. Це правильна відповідь, гарного дня
П’єр Шевальє,

4
комусь потрібно виправити це краще. Мені не потрібно було робити щось подібне, коли починаєш новий проект з рукою, повною залежностей.
Patrick W. McMahon

Дякуємо за детальну відповідь! Мені це дуже допомогло. Я розробляю React Native, насправді RN cli вимагає більшої цінності. Отже, я успішно змінюю його за допомогою вищезазначених команд. Мені просто цікаво, чи може це збільшення його значення негативно вплинути на продуктивність та використання пам’яті?
moondaddi

8

видалити реакцію node_modules

rm -r node_modules

yarn or npm install

yarn start or npm start

у разі виникнення помилки використайте цей метод ще раз


Чому це працює? Якщо це зменшує кількість файлів, що переглядаються, чи не перевстановлення необхідних залежностей додає файли назад?
крижана вода

2
@icedwater Видалення node_modules змушує React створити новий екземпляр inotify без годинників на ньому. Можливо, витік у React призводить до заповнення екземплярів inotify, тому помилка з’являється спочатку.
Викинути рахунок

7

З офіційного документа :

"Код Visual Studio не може спостерігати за змінами файлів у цій великій робочій області" (помилка ENOSPC)

Коли ви бачите це сповіщення, воно вказує на те, що у програмі перегляду файлів VS Code закінчуються дескриптори, оскільки робоча область велика і містить багато файлів. Поточний ліміт можна переглянути, запустивши:

cat /proc/sys/fs/inotify/max_user_watches

Обмеження можна збільшити до максимального значення шляхом редагування

/etc/sysctl.conf

і додавши цей рядок у кінець файлу:

fs.inotify.max_user_watches = 524288

Потім нове значення можна завантажити, запустивши

sudo sysctl -p

Зверніть увагу, що Arch Linux працює дещо інакше. Докладніші відомості див. У розділі Збільшення кількості сповіщувачів сповіщення.

Незважаючи на те, що 524 288 - це максимальна кількість файлів, які можна переглядати, якщо ви перебуваєте в середовищі, де особливо обмежена пам’ять, можливо, ви захочете зменшити число. Кожен перегляд файлів займає 540 байт (32-біт) або ~ 1 кБ (64-біт), тому, припускаючи, що споживаються всі 524 288 годин, це призводить до верхньої межі близько 256 МБ (32-біт) або 512 МБ (64-біт) ).

Інший варіант

полягає у виключенні конкретних каталогів робочої області із засобу перегляду файлів VS Code за допомогою параметра files.watcherExclude. За замовчуванням для files.watcherExclude виключаються node_modules та деякі папки під .git, але ви можете додати інші каталоги, які ви не хочете, щоб VS Code відстежував.

"files.watcherExclude": {
    "**/.git/objects/**": true,
    "**/.git/subtree-cache/**": true,
    "**/node_modules/*/**": true
  }

7

Я вирішив це питання за допомогою sudo, тобто

sudo yarn start

або

sudo npm start

5
Хоча ці команди можуть вирішити питання, включаючи пояснення того, як і чому це вирішує проблему, насправді допомогло б поліпшити якість вашої публікації, і, можливо, призведе до збільшення кількості голосів. Пам’ятайте, що ви відповідаєте на запитання читачам у майбутньому, а не лише тому, хто задає зараз. Будь ласка, відредагуйте свою відповідь, щоб додати пояснення та вказати, які обмеження та припущення застосовуються.
Брайан

це досі найпростіше рішення без зміни будь-якої конфігурації, але, як сказав @Brian, посилання чи пояснення допоможуть ефективно.
Genius

1
Це найгірше рішення. sudoне призначений для такого роду використання і може спричинити й інші проблеми.
Ігор Парра

4

Це трапилося зі мною з програмою вузлів, яку я розробляв на дистрибутиві на основі Debian. Спочатку це вирішив простий перезапуск, але це повторилося з іншим додатком.

Оскільки це пов'язано з кількістю спостерігачів, які inotify використовують для моніторингу файлів та пошуку змін у каталозі, вам слід встановити більшу кількість як обмеження:

Я зміг це вирішити за допомогою відповіді, розміщеної тут (спасибі йому!)

Отже, я побіг:

echo fs.inotify.max_user_watches=524288 | sudo tee -a /etc/sysctl.conf && sudo sysctl -p

Детальніше про те, що відбувається читайте на https://github.com/guard/listen/wiki/Increasing-the-amount-of-inotify-watchers#the-technical-details

Сподіваюся, це допоможе!


1
Чудово працює на Manjaro!
Омар Дулаймі

Вище посилання необхідний дозвіл, ось версія Вайбак машина: web.archive.org/web/20200611175407/https: //github.com/guard / ...
Махмуд К.

1

Як уже зазначав @snishalaka, ви можете збільшити кількість прихильників спостереження.

Однак я вважаю, що номер за замовчуванням досить високий і досягається лише тоді, коли процеси не очищаються належним чином. Отже, я просто перезавантажив свій комп’ютер, як було запропоновано стосовно пов’язаної проблеми github, і повідомлення про помилку зникло.


1

Будь ласка, зверніться за цим посиланням [1]. Код Visual Studio згадав коротке пояснення цього повідомлення про помилку. Я також зіткнувся з тією ж помилкою. Додавання зазначеного нижче параметра у відповідний файл вирішить цю проблему.

 fs.inotify.max_user_watches=524288

[1] https://code.visualstudio.com/docs/setup/linux#_visual-studio-code-is-unable-to-watch-for-file-changes-in-this-large-workspace-error-enospc


0

Я зіткнувся з цією проблемою в дистрибутиві linuxmint . Здавалося, це сталося, коли в моєму додатку було додано стільки папок та підпапок / файлів, які я додав до папки / public. Я застосував це виправлення, і воно спрацювало добре ...

$ echo fs.inotify.max_user_watches=524288 | sudo tee -a /etc/sysctl.conf

змінити каталог у папку / etc: cd /etc

потім запустіть це: sudo systcl -p

Можливо, доведеться закрити термінал і npm startзнову змусити його працювати.

Якщо це не вдається, я рекомендую встановити скрипти-реакції глобально та запустити додаток безпосередньо з цим.

$ npm i -g --save react-scripts

то замість npm startзапуску, react-scripts startщоб запустити вашу програму.


0

Якщо ви запускаєте свій проект у Docker, вам слід виконати команди echo fs.inotify.max_user_watches=524288 | sudo tee -a /etc/sysctl.confта та всі інші команди на хост-машині, оскільки контейнер успадковує це налаштування автоматично (і робити це безпосередньо всередині нього не буде працювати).


0

Пізня відповідь, і вже є багато хороших відповідей.

Якщо вам потрібен простий скрипт, щоб перевірити, чи є максимальний перегляд файлів достатньо великим, а якщо ні, то збільште ліміт, ось він:

#!/usr/bin/env bash

let current_watches=`sysctl -n fs.inotify.max_user_watches`

if (( current_watches < 80000 ))
then
  echo "Current max_user_watches ${current_watches} is less than 80000."
else
  echo "Current max_user_watches ${current_watches} is already equal to or greater than 80000."
  exit 0
fi

if sudo sysctl -w fs.inotify.max_user_watches=80000 && sudo sysctl -p && echo fs.inotify.max_user_watches=80000 | sudo tee /etc/sysctl.d/10-user-watches.conf
then
  echo "max_user_watches changed to 80000."
else
  echo "Could not change max_user_watches."
  exit 1
fi

Сценарій збільшує обмеження до 80000, але сміливо встановлюйте обмеження, яке ви хочете.


-1
  1. По-перше, ви можете запускати кожен раз із root правами

    sudo npm start

  2. Або ви можете видалити папку node_modules і використати npm installдля повторної інсталяції

  3. або ви можете отримати постійне рішення

    echo fs.inotify.max_user_watches=524288 | sudo tee -a /etc/sysctl.conf && sudo sysctl -p


-5

У мене була та ж проблема з використанням бібліотеки, wifiале коли я змінив свою мережу, вона працювала ідеально.

Змініть підключення до мережі


2
Це міг бути коментар
Мілан Десай
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.