React Native Error: 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
Rob

1
คุณได้พิจารณาเพิ่มโค้ดบางส่วนใน backlist ของ metro.config.js แล้วหรือยัง สิ่งนี้ควรลดปริมาณการสแกน: stackoverflow.com/questions/41813211/…
deepelement

คำตอบ:


272

Linux ใช้แพ็กเกจinotifyเพื่อสังเกตเหตุการณ์ของระบบไฟล์ไฟล์แต่ละไฟล์หรือไดเร็กทอรี

เนื่องจาก React / Angular hot-reloads และ recompiles ไฟล์ในการบันทึกจึงจำเป็นต้องติดตามไฟล์ของโครงการทั้งหมด การเพิ่มขีด จำกัด นาฬิกา inotify ควรซ่อนข้อความเตือน

คุณสามารถลองแก้ไข

# 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
เราจะเอาคนดูไปแทนที่จะปล่อยให้มากขึ้นได้อย่างไร?
Jonathan

2
ใช้งานได้ แต่ถ้าฉันอ่านถูกต้องมันจะเพิ่มขีด จำกัด ฉันสามารถปิดผู้เฝ้าดูที่เปิดอยู่แทนได้หรือไม่?
zozo

1
@NativeCoder ฉบับใหม่จะแก้ปัญหานั้นได้หรือไม่
zardilior

186

ความหมายของข้อผิดพลาดนี้คือจำนวนไฟล์ที่ตรวจสอบโดยระบบถึงขีด จำกัด แล้ว !!

ผลลัพธ์: คำสั่งดำเนินการล้มเหลว! หรือส่งคำเตือน (เช่นเรียกใช้ VSCode เริ่มต้นแบบตอบสนอง)

วิธีการแก้:

แก้ไขจำนวนไฟล์การตรวจสอบระบบ

Ubuntu

sudo gedit /etc/sysctl.conf

เพิ่มบรรทัดที่ด้านล่าง

fs.inotify.max_user_watches=524288

จากนั้นบันทึกและออก!

sudo sysctl -p

เพื่อตรวจสอบ

แล้วจะแก้ไข!


นี่แก้ไขได้ในกรณีของฉัน แชร์ในโพสต์ของฉันด้วย ขอบคุณ
Rashid Khan

ขอขอบคุณ. สิ่งนี้ช่วยแก้ปัญหาของฉันได้เช่นกัน
Nelson Katale

ขอขอบคุณ! สิ่งนี้ช่วยฉันได้
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 เพื่อเรียกใช้


รายละเอียดทางเทคนิค

Listen ใช้ inotify ตามค่าเริ่มต้นบน Linux เพื่อตรวจสอบไดเร็กทอรีสำหรับการเปลี่ยนแปลง ไม่ใช่เรื่องแปลกที่ระบบจะ จำกัด จำนวนไฟล์ที่คุณสามารถตรวจสอบได้ ตัวอย่างเช่นขีด จำกัด inotify ของ Ubuntu Lucid (64 บิต) ถูกตั้งค่าเป็น 8192

คุณสามารถรับขีด จำกัด การรับชมไฟล์ inotify ปัจจุบันของคุณได้โดยดำเนินการ:

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

เมื่อขีด จำกัด นี้ไม่เพียงพอที่จะตรวจสอบไฟล์ทั้งหมดภายในไดเร็กทอรีต้องเพิ่มขีด จำกัด เพื่อให้ Listen ทำงานได้อย่างถูกต้อง

คุณสามารถตั้งค่าขีด จำกัด ใหม่ชั่วคราวด้วย:

$ 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

หากเกิดข้อผิดพลาดให้ใช้วิธีนี้อีกครั้ง


ทำไมถึงได้ผล? ถ้ามันลดจำนวนไฟล์ที่กำลังดูการไม่ติดตั้งการอ้างอิงที่จำเป็นอีกครั้งจะเพิ่มไฟล์กลับ?
icedwater

2
@icedwater การลบ node_modules ทำให้ React สร้างอินสแตนซ์ inotify ใหม่โดยไม่มีนาฬิกาอยู่เลย อาจมีการรั่วไหลใน React ทำให้อินสแตนซ์ inotify ถูกเติมเต็มนั่นคือสาเหตุที่ข้อผิดพลาดปรากฏขึ้นตั้งแต่แรก
ทิ้งบัญชี

7

จากเอกสารอย่างเป็นทางการ :

"Visual Studio Code ไม่สามารถเฝ้าดูการเปลี่ยนแปลงไฟล์ในพื้นที่ทำงานขนาดใหญ่นี้" (ข้อผิดพลาด 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 ทำงานแตกต่างกันเล็กน้อยโปรดดูรายละเอียดในการเพิ่มจำนวนผู้เฝ้าดู inotify

แม้ว่า 524,288 จะเป็นจำนวนไฟล์สูงสุดที่สามารถรับชมได้ แต่หากคุณอยู่ในสภาพแวดล้อมที่ จำกัด หน่วยความจำโดยเฉพาะคุณอาจต้องการลดจำนวนลง การเฝ้าดูไฟล์แต่ละครั้งจะใช้เวลามากถึง 540 ไบต์ (32 บิต) หรือ ~ 1kB (64 บิต) ดังนั้นสมมติว่านาฬิกาทั้งหมด 524,288 เรือนถูกใช้งานจะส่งผลให้มีขอบเขตบนประมาณ 256MB (32 บิต) หรือ 512MB (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 ie

sudo yarn start

หรือ

sudo npm start

5
แม้ว่าคำสั่งเหล่านั้นอาจช่วยแก้ปัญหาได้รวมถึงคำอธิบายว่าทำไมจึงแก้ปัญหานี้ได้จะช่วยปรับปรุงคุณภาพของโพสต์ของคุณได้อย่างแท้จริงและอาจส่งผลให้มีการโหวตเพิ่มขึ้น จำไว้ว่าคุณกำลังตอบคำถามสำหรับผู้อ่านในอนาคตไม่ใช่แค่คนที่ถามตอนนี้ โปรดแก้ไขคำตอบของคุณเพื่อเพิ่มคำอธิบายและระบุข้อ จำกัด และสมมติฐานที่ใช้
Brian

จนถึงตอนนี้เป็นวิธีแก้ปัญหาที่ง่ายที่สุดโดยไม่ต้องเปลี่ยนการกำหนดค่าใด ๆ แต่อย่างที่ @Brian กล่าวการอ้างอิงหรือคำอธิบายจะช่วยได้อย่างมีประสิทธิภาพ
Genius

1
นี่เป็นทางออกที่แย่ที่สุด sudoไม่ได้มีไว้สำหรับการใช้งานประเภทนี้และอาจทำให้เกิดปัญหาอื่น ๆ ด้วย
Igor Parra

4

มันเกิดขึ้นกับฉันด้วยแอปโหนดที่ฉันกำลังพัฒนาบน Distro ที่ใช้ 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!
Omar Dulaimi

ลิงก์ด้านบนต้องได้รับอนุญาตนี่คือเวอร์ชันเครื่องสำรอง
Mahmoud K.

1

ตามที่ระบุไว้แล้วโดย @snishalaka คุณสามารถเพิ่มจำนวนผู้ชมที่ไม่สามารถรับรู้ได้

อย่างไรก็ตามฉันคิดว่าจำนวนเริ่มต้นนั้นสูงเพียงพอและจะถึงก็ต่อเมื่อกระบวนการไม่ได้รับการทำความสะอาดอย่างถูกต้อง ดังนั้นฉันจึงรีสตาร์ทคอมพิวเตอร์ตามที่เสนอเกี่ยวกับปัญหา github ที่เกี่ยวข้องและข้อความแสดงข้อผิดพลาดก็หายไป


1

โปรดดูลิงก์นี้ [1] รหัส Visual Studio ได้กล่าวถึงคำอธิบายสั้น ๆ สำหรับข้อความแสดงข้อผิดพลาดนี้ ฉันยังพบข้อผิดพลาดเดียวกัน การเพิ่มพารามิเตอร์ด้านล่างในไฟล์ relavant จะช่วยแก้ปัญหานี้ได้

 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

ฉันพบปัญหานี้ในdistro linuxmint ดูเหมือนว่าจะเกิดขึ้นเมื่อมีโฟลเดอร์และโฟลเดอร์ย่อย / ไฟล์จำนวนมากที่ฉันเพิ่มลงในโฟลเดอร์ / public ในแอปของฉัน ฉันใช้การแก้ไขนี้และได้ผลดี ...

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

เปลี่ยนไดเร็กทอรีเป็นโฟลเดอร์ / etc: cd /etc

จากนั้นเรียกใช้สิ่งนี้: sudo systcl -p

คุณอาจต้องปิดเทอร์มินัลและnpm startอีกครั้งเพื่อให้ใช้งานได้

หากล้มเหลวฉันขอแนะนำให้ติดตั้ง react-scripts ทั่วโลกและเรียกใช้แอปพลิเคชันของคุณโดยตรงด้วยสิ่งนั้น

$ 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. ประการแรกคุณสามารถเรียกใช้ทุกครั้งด้วยสิทธิ์ระดับราก

    เริ่ม sudo npm

  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
นี่อาจเป็นความคิดเห็น
Milan Desai
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.