Sửa lỗi 'EPERM: operation not permitted, watch' trên macOS

beginner🍎 macOS2026-07-08| macOS (Intel/Apple Silicon), Node.js, npm/yarn, VS Code/Terminal

Error Message

Error: EPERM: operation not permitted, watch
#macOS#Node.js#npm#React#Phát triển Web

Tại sao lỗi này xảy ra

Bạn chạy npm start, sẵn sàng để lập trình, nhưng terminal lại hiển thị một loạt dòng chữ đỏ: EPERM: operation not permitted, watch. Lỗi này thường xảy ra do lớp bảo mật của macOS đang chặn Node.js theo dõi các tệp trong dự án của bạn. Nó đặc biệt phổ biến trong các dự án React, Vue hoặc Angular sử dụng fsevents để theo dõi các thay đổi.

Cho dù bạn vừa mới chuyển sang máy Mac M3 mới hay cập nhật lên macOS Sonoma, nguyên nhân gốc rễ thường là do nghẽn quyền truy cập hoặc liên kết binary bị hỏng. Dưới đây là cách để vượt qua trở ngại này và quay lại làm việc.

Bước 1: Cấp quyền Truy cập Toàn bộ Ổ đĩa (Full Disk Access)

Các thiết lập quyền riêng tư của Apple ngày càng trở nên khắt khe hơn. Nếu Terminal hoặc VS Code của bạn không được phép theo dõi các tệp trong thư mục một cách rõ ràng, hệ thống sẽ dừng tiến trình để bảo vệ dữ liệu của bạn.

  • Mở System Settings (Cài đặt hệ thống).
  • Đi tới Privacy & Security (Quyền riêng tư & Bảo mật) > Full Disk Access (Truy cập Toàn bộ Ổ đĩa).
  • Nhấp vào biểu tượng +.
  • Thêm terminal của bạn (Terminal, iTerm2, hoặc Warp) và trình soạn thảo (VS Code).
  • Gạt nút sang ON cho mỗi ứng dụng.
  • Quan trọng: Thoát hoàn toàn (Cmd+Q) và khởi động lại terminal để thay đổi có hiệu lực.

Bước 2: Cài đặt Watchman

Trình theo dõi tệp mặc định của Node có thể hoạt động không ổn định trên macOS. Meta đã phát triển một công cụ gọi là watchman cụ thể để xử lý các cây thư mục tệp khổng lồ một cách hiệu quả hơn. Nó thường giải quyết được lỗi EPERM bằng cách cung cấp một giao diện mạnh mẽ hơn cho các sự kiện của hệ thống tệp.

Nếu bạn đã cài Homebrew, hãy cài đặt nó bằng một lệnh duy nhất:

brew install watchman

Nhiều framework, bao gồm cả React Native, hiện nay coi Watchman là một yêu cầu tiêu chuẩn để phát triển trên macOS.

Bước 3: Build lại fsevents cho kiến trúc máy của bạn

Bạn có chuyển từ Mac Intel sang Apple Silicon (M1/M2/M3) không? Nếu có, thư mục node_modules của bạn có thể chứa các binary dựa trên Intel không thể chạy bình thường trên chip mới. Sự không tương thích này thường xuyên gây ra lỗi fsevents.

Hãy làm sạch dự án bằng các lệnh sau:

# Xóa các tệp rác
rm -rf node_modules package-lock.json yarn.lock

# Xóa cache npm để tránh các binary cũ
npm cache clean --force

# Cài đặt lại từ đầu
npm install

Điều này buộc npm phải tải xuống và biên dịch phiên bản fsevents phù hợp với phần cứng hiện tại của bạn.

Bước 4: Sửa quyền sở hữu thư mục

Nếu bạn từng vô tình chạy sudo npm install, một số tệp trong dự án hiện thuộc về người dùng 'root'. Tài khoản tiêu chuẩn của bạn không có quyền 'theo dõi' các tệp đó, dẫn đến lỗi EPERM ngay lập tức.

Chạy lệnh này để lấy lại quyền sở hữu dự án của bạn:

sudo chown -R $(whoami) .

Lệnh này sẽ thay đổi đệ quy mọi tệp trong thư mục hiện tại thuộc về bạn. Sẽ không còn xung đột về quyền hạn nữa.

Xác minh: Kiểm tra kết quả

Khởi động lại dev server bằng cách chạy npm start. Sau khi nó hoạt động, hãy mở bất kỳ component nào và thêm một dòng console.log('test') đơn giản. Nếu terminal hiển thị Compiling... hoặc Reloading... mà không bị crash, bạn đã sửa lỗi thành công.

Mẹo chuyên nghiệp để làm việc trơn tru hơn

  • Ngừng sử dụng sudo: Hầu như không bao giờ có lý do chính đáng để sử dụng sudo với npm. Nếu bạn thấy mình cần đến nó, có khả năng bản cài đặt Node của bạn đã được cấu hình sai.
  • Chuyển sang NVM: Sử dụng Node Version Manager để cài đặt Node. Nó giữ mọi thứ trong thư mục người dùng của bạn (/Users/name/.nvm) thay vì các thư mục được hệ thống bảo vệ.
  • Quản lý giới hạn tệp: Nếu dự án của bạn có hơn 10.000 tệp, hệ điều hành có thể đạt đến giới hạn 'mở tệp'. Đảm bảo .gitignore của bạn bao gồm các thư mục nặng như distbuild để giảm tải cho trình theo dõi.

Related Error Notes