React Native Error: ENOSPC: Osiągnięto limit systemowy dotyczący liczby obserwatorów plików

161

Skonfigurowałem nową, pustą aplikację natywną.

Po zainstalowaniu kilku modułów węzłów dostałem ten błąd.

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)

Wiem, że jest to związane z brakiem miejsca na obserwowanie przez strażnika wszystkich zmian plików.

Chcę wiedzieć, jakie działania najlepiej podjąć w tym miejscu?

Czy powinienem zignorować node_modulesfolder, dodając go do .watchmanconfig?

Badis Merabet
źródło
24
NIGDY nie publikuj obrazów kodu, błędów ani wyników! stackoverflow.com/help/how-to-ask
Rob
1
Czy rozważałeś dodanie części kodu do backlist metro.config.js? Powinno to zmniejszyć objętość skanowania: stackoverflow.com/questions/41813211/…
deepelement

Odpowiedzi:

273

Linux używa pakietu inotify do obserwowania zdarzeń systemu plików, pojedynczych plików lub katalogów.

Ponieważ React / Angular przeładowuje i ponownie kompiluje pliki przy zapisywaniu, musi śledzić wszystkie pliki projektu. Zwiększenie limitu obserwacyjnego inotify powinno spowodować ukrycie komunikatów ostrzegawczych.

Możesz spróbować edytować

# 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
Abdulla Thanseeh
źródło
41
To nie wyjaśnia, na czym polega problem, jakie jest rozwiązanie ani w jaki sposób rozwiązanie rozwiązuje problem.
Native Coder
2
wow, napotkałem problem podobny do opisanego powyżej, ale to rozwiązanie w 100% go rozwiązało. dziękuję
akolliy
3
Jak zabrać obserwatorów zamiast pozwalać na więcej?
Jonathan
2
Działa, ale jeśli dobrze przeczytam, to podnosi limit. Czy w ogóle mogę zamiast tego zamknąć otwarte obserwatory?
zozo
1
@NativeCoder czy nowa edycja rozwiązałaby ten problem?
zardilior
186

Znaczenie tego błędu polega na tym, że liczba plików monitorowanych przez system osiągnęła limit !!

Wynik: wykonanie polecenia nie powiodło się! Lub wyślij ostrzeżenie (takie jak wykonanie kodu VSCode natywnego reagowania)

Rozwiązanie:

Zmodyfikuj liczbę plików monitorowania systemu

Ubuntu

sudo gedit /etc/sysctl.conf

Dodaj linię na dole

fs.inotify.max_user_watches=524288

Następnie zapisz i wyjdź!

sudo sysctl -p

żeby to sprawdzić

Wtedy jest rozwiązany!

YASH THUMAR
źródło
Hej, to rozwiązało się w moim przypadku. Udostępnione również na moim poście. Dziękuję
Rashid Khan
Dziękuję Ci. To również rozwiązało mój problem.
Nelson Katale
Dziękuję Ci! To mi pomogło.
WISERDIVISOR
66

Możesz to naprawić, zwiększając liczbę inotify obserwatorów.

Jeśli nie interesują Cię szczegóły techniczne i chcesz tylko posłuchać pracy:

  • Jeśli używasz Debiana, RedHata lub innej podobnej dystrybucji Linuksa, uruchom na terminalu następujące polecenie:

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

  • Jeśli używasz ArchLinux, uruchom następującą komendę

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

Następnie wklej go do swojego terminala i naciśnij Enter, aby go uruchomić.


Szczegóły techniczne

Listen używa domyślnie inotify w systemie Linux do monitorowania katalogów pod kątem zmian. Nierzadko zdarza się, że system ogranicza liczbę plików, które można monitorować. Na przykład limit inotify w Ubuntu Lucid (64-bitowy) jest ustawiony na 8192.

Możesz uzyskać aktualny limit obserwowania plików inotify, wykonując:

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

Jeśli ten limit nie jest wystarczający do monitorowania wszystkich plików w katalogu, należy go zwiększyć, aby funkcja Listen działała poprawnie.

Możesz ustawić nowy tymczasowy limit za pomocą:

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

Jeśli chcesz, aby Twój limit stał się stały, użyj:

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

Być może będziesz musiał zwracać uwagę na wartości max_queued_eventsi max_user_instancesjeśli będziesz słuchać, narzekaj.

snishalaka
źródło
2
Wow, dziękuję bardzo, to rozwiązało mój problem z podobnym błędem z React JS, ponieważ mój projekt stał się większy, ale nie mogłem zrozumieć szczegółów błędu. To właściwa odpowiedź, miłego dnia
Pierre Chevallier,
4
ktoś musi to lepiej naprawić. Nie powinienem robić czegoś takiego, rozpoczynając nowy projekt z dużą ilością zależności.
Patrick W. McMahon
Dziękuję za szczegółową odpowiedź! Bardzo mi to pomogło. Rozwijam React Native, właściwie CLI RN wymaga od niego większej wartości. Dlatego pomyślnie zmieniam go za pomocą powyższych poleceń. Zastanawiam się tylko, czy wyższa wartość może źle wpłynąć na wydajność i zużycie pamięci?
moondaddi
8

usuń reaguj node_modules

rm -r node_modules

yarn or npm install

yarn start or npm start

jeśli wystąpi błąd, użyj tej metody ponownie

Nieświadomy
źródło
Dlaczego to działa? Jeśli zmniejszy to liczbę obserwowanych plików, czy ponowna instalacja niezbędnych zależności nie spowoduje ponownego dodania plików?
icedwater
2
@icedwater Usunięcie node_modules powoduje, że React tworzy nową instancję inotify, bez żadnych zegarków. Prawdopodobnie w Reakcie jest wyciek, który powoduje zapełnienie instancji inotify, dlatego błąd pojawia się w pierwszej kolejności.
Wyrzuć konto
7

Z oficjalnego dokumentu :

„Visual Studio Code nie może obserwować zmian plików w tym dużym obszarze roboczym” (błąd ENOSPC)

To powiadomienie oznacza, że ​​w obserwatorze plików VS Code zabrakło uchwytów, ponieważ obszar roboczy jest duży i zawiera wiele plików. Aktualny limit można sprawdzić, uruchamiając:

cat /proc/sys/fs/inotify/max_user_watches

Limit można zwiększyć do maksimum poprzez edycję

/etc/sysctl.conf

i dodając tę ​​linię na końcu pliku:

fs.inotify.max_user_watches = 524288

Nową wartość można następnie załadować, uruchamiając

sudo sysctl -p

Zwróć uwagę, że Arch Linux działa trochę inaczej, zobacz Zwiększanie liczby obserwatorów inotify, aby uzyskać szczegółowe informacje.

Podczas gdy 524288 to maksymalna liczba plików, które można oglądać, jeśli jesteś w środowisku, które jest szczególnie ograniczone pamięcią, możesz chcieć zmniejszyć tę liczbę. Każdy obserwowany plik zajmuje 540 bajtów (32-bitowy) lub ~ 1kB (64-bitowy), więc zakładając, że wszystkie 524288 zegarków jest zużytych, daje to górną granicę około 256 MB (32-bit) lub 512 MB (64-bit ).

Inna opcja

polega na wykluczeniu określonych katalogów obszaru roboczego z monitora plików VS Code za pomocą ustawienia files.watcherExclude. Wartość domyślna files.watcherExclude wyklucza node_modules i niektóre foldery w .git, ale możesz dodać inne katalogi, których nie chcesz śledzić w VS Code.

"files.watcherExclude": {
    "**/.git/objects/**": true,
    "**/.git/subtree-cache/**": true,
    "**/node_modules/*/**": true
  }
HoangYell
źródło
7

Rozwiązałem ten problem za pomocą sudo ie

sudo yarn start

lub

sudo npm start
prem
źródło
5
Chociaż te polecenia mogą rozwiązać problem, w tym wyjaśnienie, jak i dlaczego to rozwiązuje problem, naprawdę pomogłoby poprawić jakość twojego posta i prawdopodobnie spowodowałoby więcej głosów pozytywnych. Pamiętaj, że odpowiadasz na pytanie do czytelników w przyszłości, a nie tylko osoba, która zapyta teraz. Proszę edytować swoje odpowiedzi, aby dodać wyjaśnień i dać wskazówkę co zastosować ograniczenia i założenia.
Brian
jest to do tej pory najprostsze rozwiązanie bez zmiany konfiguracji, ale jak powiedział @Brian, odniesienie lub wyjaśnienie pomoże w skuteczny sposób.
Genius,
1
To jest najgorsze rozwiązanie. sudonie jest przeznaczony do tego rodzaju zastosowań i może powodować inne problemy.
Igor Parra
4

Zdarzyło mi się to w przypadku aplikacji node, którą tworzyłem w dystrybucji opartej na Debianie. Po pierwsze, proste ponowne uruchomienie rozwiązało problem, ale stało się to ponownie w innej aplikacji.

Ponieważ jest to związane z liczbą obserwatorów, których inotify używa do monitorowania plików i wyszukiwania zmian w katalogu, musisz ustawić wyższą liczbę jako limit:

Udało mi się go rozwiązać z odpowiedzi zamieszczonej tutaj (dzięki niemu!)

Więc pobiegłem:

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

Przeczytaj więcej o tym, co się dzieje na https://github.com/guard/listen/wiki/Increasing-the-amount-of-inotify-watchers#the-technical-details

Mam nadzieję, że to pomoże!

Rodrigo.A92
źródło
1
Działa świetnie na Manjaro!
Omar Dulaimi,
Powyższy link wymaga pozwolenia, oto wersja maszyny Wayback
Mahmoud K.
1

Jak już wskazał @snishalaka, możesz zwiększyć liczbę obserwatorów inotify.

Myślę jednak, że domyślna liczba jest wystarczająco wysoka i jest osiągnięta tylko wtedy, gdy procesy nie są prawidłowo oczyszczone. Dlatego po prostu ponownie uruchomiłem komputer zgodnie z propozycją w powiązanym problemie z githubem i komunikat o błędzie zniknął.

Uchendu
źródło
0

Napotkałem ten problem w dystrybucji linuxmint . Wydawało się, że stało się tak, gdy było tak wiele folderów i podfolderów / plików, które dodałem do folderu / public w mojej aplikacji. Zastosowałem tę poprawkę i zadziałało dobrze ...

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

zmień katalog na folder / etc: cd /etc

następnie uruchom to: sudo systcl -p

Być może będziesz musiał zamknąć terminal i npm startponownie, aby zaczął działać.

Jeśli to się nie powiedzie, zalecam zainstalowanie skryptów React-scripts na całym świecie i bezpośrednie uruchomienie aplikacji.

$ npm i -g --save react-scripts

wtedy zamiast npm startbiegu react-scripts start, aby uruchomić aplikację.

Tony Marfo O
źródło
0

Jeśli uruchamiasz projekt w Dockerze, powinieneś wykonać te echo fs.inotify.max_user_watches=524288 | sudo tee -a /etc/sysctl.confi wszystkie inne polecenia na maszynie hosta, ponieważ kontener odziedziczy to ustawienie automatycznie (i zrobienie tego bezpośrednio w nim nie zadziała).

Diego MF
źródło
0

Późna odpowiedź i jest już wiele dobrych odpowiedzi.

Jeśli chcesz, aby prosty skrypt sprawdził, czy maksymalna liczba obserwowanych plików jest wystarczająco duża, a jeśli nie, zwiększ limit, oto jest:

#!/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

Skrypt zwiększa limit do 80000, ale możesz ustawić limit, który chcesz.

Antony
źródło
-1
  1. Po pierwsze, możesz uruchamiać się za każdym razem z uprawnieniami roota

    sudo npm start

  2. Lub możesz usunąć folder node_modules i użyć go npm installdo ponownej instalacji

  3. lub możesz uzyskać trwałe rozwiązanie

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

MD SHAYON
źródło
-5

Miałem ten sam problem, korzystając z biblioteki, wifiale kiedy zmieniłem sieć, działało idealnie.

Zmień połączenie sieciowe

Satar.619
źródło
2
To mógł być komentarz
Milan Desai