Làm thế nào để vượt qua thiết bị hoặc tài nguyên bận rộn trên mạng?


229

Tôi đã thử vào rm -rfmột thư mục và nhận được "thiết bị hoặc tài nguyên bận".

Trong Windows, tôi đã sử dụng LockHunter để giải quyết vấn đề này. Tương đương linux là gì? (Vui lòng đưa ra câu trả lời bằng phương pháp "mở khóa" đơn giản này và không hoàn thành các bài viết như thế này . Mặc dù chúng hữu ích, nhưng hiện tại tôi chỉ quan tâm đến ASimpleMethodThatWorks ™)


5
Cảm ơn điều này rất tiện lợi - Tôi đã chuyển từ Linux sang Windows, đang tìm kiếm tương đương với lsof - LockHunter.
Sonia Hamilton

3
Cái quái gì thế? Unix không ngăn bạn xóa các tệp đang mở như Windows. Đây là lý do tại sao bạn có thể xóa toàn bộ hệ thống của mình bằng cách chạy rm -rf /... nó sẽ vui vẻ xóa mọi tệp duy nhất, bao gồm / bin / rm.
psusi

1
@psusi, điều đó không chính xác. Bạn có một nguồn thông tin xấu hoặc chỉ đang tạo ra thứ gì đó. Linux, giống như Windows, có khóa tệp và thiết bị. Đó là loại vỡ, mặc dù. 0pulum.de/blog/projects/locking.html
foobarbiru

1
@foobarbiru, thông thường đó chỉ là các khóa tư vấn và trang man ít nhất dường như chỉ ra rằng chúng chỉ dành cho đọc / ghi, không bỏ liên kết.
psusi

Câu trả lời:


232

Công cụ bạn muốn là lsof, viết tắt của danh sách các tệp đang mở .

Nó có rất nhiều tùy chọn, vì vậy hãy kiểm tra trang man, nhưng nếu bạn muốn xem tất cả các tệp đang mở trong một thư mục:

lsof +D /path

Điều đó sẽ lặp lại thông qua hệ thống tập tin bên dưới /path, vì vậy hãy cẩn thận khi thực hiện nó trên các cây thư mục lớn.

Khi bạn biết quy trình nào có tệp mở, bạn có thể thoát các ứng dụng đó hoặc tắt chúng bằng kill(1)lệnh.


46
Nếu không có kết quả thì sao?
thủy quân lục chiến

22
@marines: Kiểm tra xem hệ thống tập tin khác có được gắn bên dưới không /path. Đó là một trong những nguyên nhân của "tập tin mở" ẩn.
camh

2
Lệnh lsof trực tiếp đến đường dẫn không hoạt động. Vì vậy, về cơ bản cần phải đi vào vị trí đường dẫn và sau đó chạy lsof busy_file sau đó giết tất cả quá trình
J4cK

4
lsofdường như không làm gì cho tôi: lsof storage/logs/laravel.logkhông trả lại gì, và cũng vậy lsof +D storage/logs/. umounttrả lời với not mounted.
Ryan

1
Chỉ cần giải thích về câu trả lời @camh: Sử dụng mount | grep <path>. Điều đó cho thấy bất kỳ /dev/<abc>có thể được gắn trên <path>. Sử dụng sudo umount -lf /dev/<abc>và sau đó cố gắng để loại bỏ <path>. Làm việc cho tôi. Cảm ơn @camh
Vikas Goel

107

đôi khi, đó là kết quả của sự cố gắn kết, vì vậy tôi sẽ ngắt kết nối hệ thống tập tin hoặc thư mục mà bạn đang cố xóa:

ô / con đường


5
Đó là một 03:45. Cảm ơn người đàn ông, bạn đã cứu đêm của tôi. Vui nhộn. Trên một dòng - rất nhiều thời gian lãng phí -.- '
Aiyion.Prime

1
vấn đề của tôi là một thư mục nhật ký được gắn kết là / dev / mapper / vg00-root
Spikolynn

1
Giúp tôi thoát khỏi một mứt tương tự trên cuộn dây.
Jon

1
trong trường hợp của tôi, Jenkins đã không ngắt kết nối thư mục sau khi hủy bỏ nhiệm vụ
zarkone

1
trong trường hợp của tôi, unmount với máy tính để bàn Ubuntu đã hoạt động !! Cảm ơn
JRichardsz

14

Tôi sử dụng fusercho loại điều này. Nó sẽ liệt kê quá trình nào đang sử dụng một tập tin hoặc tập tin trong một mount.


fuserchỉ giúp trong trường hợp cụ thể khi bạn muốn ngắt kết nối hệ thống tập tin. Vấn đề ở đây là tìm những gì sử dụng một tập tin cụ thể.
Gilles

@Gilles: Cũng hoạt động cho các tập tin.
BillThor

Xin lỗi, phản đối sai: fuserkhông giúp được gì ở đây vì vấn đề là tìm tất cả các tệp đang mở trong cây thư mục. Bạn có thể yêu lsofcầu hiển thị tất cả các tệp và bộ lọc hoặc làm cho nó lặp lại; fuserkhông có chế độ như vậy và cần phải được gọi trên mỗi tệp.
Gilles

@Giles: fusercông trình sẽ liệt kê. Hãy thử fuser /var/log/*, nếu bất kỳ bản ghi nào được mở, nó sẽ cho biết cái nào và ai đã mở nó. Nếu một ký tự đại diện đơn giản, sẽ không hoạt động, findcó hoặc không có xargssẽ thực hiện công việc.
BillThor

1
lsofkhông phải trong đường dẫn của tôi khi đó fuser, cho phép tôi tìm ID tiến trình vi phạm để giết, vì vậy + 1 + cảm ơn.
stevesliva

12

Đây là giải pháp:

  1. Đi vào thư mục và gõ ls -a
  2. Bạn sẽ tìm thấy một .xyztập tin
  3. vi .xyz và xem nội dung của tập tin là gì
  4. ps -ef | grep username
  5. Bạn sẽ thấy nội dung .xyz trong cột thứ 8 (hàng cuối cùng)
  6. kill -9 job_ids - trong đó job_ids là giá trị của cột thứ 2 có nội dung gây ra lỗi tương ứng trong cột thứ 8
  7. Bây giờ hãy thử xóa thư mục hoặc tập tin.

4
Sẽ rất thú vị khi biết những tập tin bí ẩn đó đến từ đâu.
John WH Smith

9

Tôi cũng gặp vấn đề tương tự, đã xây dựng một lớp lót bắt đầu bằng khuyến nghị @camh:

lsof +D ./ | awk '{print $2}' | tail -n +2 | xargs kill -9

Các awklệnh lấy PID. Các taillệnh được thoát khỏi sự xâm nhập đầu tiên pesky: "PID". Tôi đã sử dụng -9để giết, những người khác có thể có các lựa chọn an toàn hơn.


1
Để làm cho nó phổ quát hơn, bạn có thể sử dụng ./ cho thư mục hiện tại thay vì log /
user2589273

Điểm tốt, @ user2589273. Đã cập nhật.
Choylton B. Higginbottom

5

Tôi gặp vấn đề này khi một bài kiểm tra tự động tạo ra một đĩa RAM. Các lệnh được đề xuất trong các câu trả lời khác, lsoffuser, không có ích. Sau khi kiểm tra tôi đã cố gắng ngắt kết nối nó và sau đó xóa thư mục. Tôi đã thực sự bối rối trong nhiều năm bởi vì tôi không thể thoát khỏi nó - Tôi cứ bị "Thiết bị hoặc tài nguyên bận rộn" !

Tình cờ tôi tìm ra cách thoát khỏi ramdisk. Tôi đã phải ngắt kết nối nó với cùng số lần tôi đã chạy mountlệnh, tức là sudo umount path

Do thực tế là nó được tạo ra bằng thử nghiệm tự động, nó đã được gắn kết nhiều lần, do đó tôi không thể thoát khỏi nó bằng cách đơn giản là ngắt kết nối nó một lần sau các thử nghiệm. Vì vậy, sau khi tôi tự ngắt kết nối nó nhiều lần, cuối cùng nó lại trở thành một thư mục thông thường và tôi có thể xóa nó.

Hy vọng rằng điều này có thể giúp đỡ người khác gặp phải vấn đề này!


5

Tôi gặp điều này thường xuyên trên các máy chủ có hệ thống tệp mạng NFS. Tôi giả sử nó có liên quan đến hệ thống tập tin, vì các tập tin thường được đặt tên như thế .nfs000000123089abcxyz.

Giải pháp điển hình của tôi là đổi tên hoặc di chuyển thư mục mẹ của tệp, sau đó quay lại sau một hoặc hai ngày và tệp sẽ tự động bị xóa, tại thời điểm đó tôi có thể tự do xóa thư mục.

Điều này thường xảy ra trong các thư mục nơi tôi đang cài đặt hoặc biên dịch thư viện phần mềm.


4

Bỏ qua câu hỏi của Bohhat ở trên, tôi đã gặp vấn đề này trong macos high sierra khi tôi mắc kẹt một quy trình encfs, khởi động lại đã giải quyết nó, nhưng điều này

ps -ef | grep name-of-busy-dir

Chỉ cho tôi quá trình và PID (cột hai).

sudo kill -15 pid-here

Đã sửa nó.


Điều này làm việc cho tôi quá. Cái -15
O.rka

3

Nếu bạn có máy chủ truy cập, hãy thử

Xóa thư mục đó khỏi máy chủ

Hoặc, làm umountgắn kết lại, thử umount -l: lười biếng umount nếu gặp bất kỳ vấn đề nào trên umount bình thường.

Tôi cũng có vấn đề này

lsof +D path : không cho đầu ra

ps -ef : không cung cấp thông tin liên quan

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.