วิธีเอาชนะ "อุปกรณ์หรือทรัพยากรไม่ว่าง" ได้อย่างไร


229

ฉันพยายามไปยังrm -rfโฟลเดอร์และได้รับ "อุปกรณ์หรือทรัพยากรไม่ว่าง"

ใน Windows ฉันจะใช้ LockHunter เพื่อแก้ไขปัญหานี้ linux มีค่าเทียบเท่าอะไร? (โปรดให้คำตอบง่ายๆว่า "ปลดล็อกวิธีนี้" และไม่ใช่บทความที่สมบูรณ์เช่นนี้แม้ว่าจะเป็นประโยชน์ แต่ตอนนี้ฉันสนใจเพียงแค่ ASimpleMethodThatWorks ™)


5
ขอบคุณสิ่งนี้มีประโยชน์ - ฉันมาจาก Linux กับ Windows กำลังมองหา lsof - LockHunter ที่เทียบเท่ากัน
Sonia Hamilton

3
อะไรกันเนี่ย? Unix ไม่ได้ป้องกันคุณจากการลบไฟล์ที่เปิดเหมือน Windows นี่คือเหตุผลที่คุณสามารถลบทั้งระบบได้ด้วยการรันrm -rf /... มันจะลบทุกไฟล์อย่างมีความสุขรวมถึง / bin / rm
psusi

1
@psusi นั่นไม่ถูกต้อง คุณมีแหล่งข้อมูลที่ไม่ดีหรือกำลังสร้างข้อมูล Linux เช่น Windows มีการล็อคไฟล์และอุปกรณ์ แม้ว่ามันจะแตกหัก 0pointer.de/blog/projects/locking.html
foobarbecue

1
@foobarbecue โดยปกติแล้วจะเป็นเพียงการล็อกคำแนะนำและหน้าอย่างน้อยดูเหมือนว่าจะระบุว่าเป็นการอ่าน / เขียนเท่านั้นไม่ใช่การยกเลิกการเชื่อมโยง
psusi

คำตอบ:


232

เครื่องมือที่คุณต้องการคือlsofซึ่งย่อมาจากรายการไฟล์ที่เปิด

มีตัวเลือกมากมายให้ตรวจสอบ man page แต่หากคุณต้องการดูไฟล์ที่เปิดอยู่ทั้งหมดในไดเรกทอรี:

lsof +D /path

สิ่งนั้นจะถูกคืนค่าผ่านระบบไฟล์ด้านล่าง/pathดังนั้นให้ระวังไว้ในไดเรกทอรีต้นไม้ขนาดใหญ่

เมื่อคุณทราบว่ากระบวนการใดที่มีไฟล์เปิดอยู่คุณสามารถออกจากแอพเหล่านั้นหรือฆ่ามันด้วยkill(1)คำสั่ง


46
เกิดอะไรขึ้นถ้าไม่มีผลลัพธ์?
นาวิกโยธิน

22
@marines: /pathตรวจสอบว่าระบบแฟ้มอื่นจะติดตั้งอยู่ใต้ นั่นเป็นสาเหตุหนึ่งของการ "เปิดไฟล์" ที่ซ่อนอยู่
camh

2
คำสั่ง lsof โดยตรงกับพา ธ ไม่ทำงาน ดังนั้นโดยทั่วไปจำเป็นต้องไปในตำแหน่งของเส้นทางแล้วเรียกใช้ lsof busy_file แล้วฆ่ากระบวนการทั้งหมด
J4cK

4
lsofดูเหมือนจะไม่ทำอะไรเลยสำหรับฉัน: lsof storage/logs/laravel.logส่งคืนอะไรเลยและก็ทำlsof +D storage/logs/เช่นนั้น ตอบโต้ด้วยumount not mounted
Ryan

1
เพียงเพื่ออธิบายรายละเอียดในคำตอบ @camh: mount | grep <path>ใช้ นั่นแสดงให้เห็นใด ๆ ที่อาจจะมีการติดตั้งอยู่บนที่/dev/<abc> <path>ใช้แล้วพยายามที่จะเอาsudo umount -lf /dev/<abc> <path>ใช้งานได้สำหรับฉัน ขอบคุณ @camh
Vikas Goel

107

บางครั้งเป็นผลมาจากปัญหาการติดตั้งดังนั้นฉันจะ unmount ระบบไฟล์หรือไดเรกทอรีที่คุณพยายามลบ:

เส้นทาง / เส้นทาง


5
มันเป็นสี่ถึงสี่ ขอบคุณชายคุณช่วยชีวิตฉันไว้ เฮฮา. ในบรรทัดเดียว - เสียเวลามาก -. - '
Aiyion.Prime

1
ปัญหาของฉันได้รับการไดเรกทอรีล็อกติดตั้ง / dev / mapper / vg00 ราก
Spikolynn

1
ช่วยฉันออกจากการจราจรติดขัดคล้ายกับ winders
Jon

1
ในกรณีของฉันเจนกินส์ไม่ได้ยกเลิกการต่อเชื่อม chroot dir หลังจากเลิกงาน
zarkone

1
ในกรณีของฉัน unmount กับเดสก์ทอป Ubuntu ทำงาน !! ขอบคุณ
JRichardsz

14

ฉันใช้fuserสิ่งนี้ มันจะแสดงรายการกระบวนการที่ใช้ไฟล์หรือไฟล์ภายในเมาท์


fuserช่วยในกรณีเฉพาะเมื่อคุณต้องการยกเลิกการต่อเชื่อมระบบไฟล์ นี่คือปัญหาคือการค้นหาสิ่งที่ใช้ไฟล์เฉพาะ
Gilles

@Gilles: ยังใช้งานได้กับไฟล์
BillThor

ขออภัยการคัดค้านผิด: fuserไม่ได้ช่วยที่นี่เพราะปัญหาคือการหาไฟล์ที่เปิดอยู่ทั้งหมดในโครงสร้างไดเรกทอรี คุณสามารถบอกlsofให้แสดงไฟล์และตัวกรองทั้งหมดหรือทำให้เป็นแบบนั้นก็ได้ fuserไม่มีโหมดดังกล่าวและจำเป็นต้องเรียกใช้ในทุกไฟล์
Gilles

@Giles: fuserรายการจะทำงาน ลองfuser /var/log/*ถ้ามีการเปิดบันทึกใด ๆ มันจะบอกว่าใครเป็นใครและใครเป็นคนเปิด หากสัญลักษณ์แทนง่าย ๆ จะไม่ทำงานหากfindมีหรือไม่มีxargsจะทำงาน
BillThor

1
lsofไม่ได้อยู่ในเส้นทางของฉันในขณะfuserนั้นทำให้ฉันสามารถหารหัสกระบวนการที่ละเมิดเพื่อฆ่าได้ดังนั้นจึง +1 มากกว่านี้
stevesliva

12

นี่คือทางออก:

  1. ไปที่ไดเรกทอรีและพิมพ์ ls -a
  2. คุณจะพบ.xyzไฟล์
  3. vi .xyz และดูว่าเนื้อหาของไฟล์คืออะไร
  4. ps -ef | grep username
  5. คุณจะเห็นเนื้อหา. xyz ในคอลัมน์ที่ 8 (แถวสุดท้าย)
  6. kill -9 job_ids - โดยที่ job_ids คือค่าของคอลัมน์ที่ 2 ของข้อผิดพลาดที่สอดคล้องกันทำให้เกิดเนื้อหาในคอลัมน์ที่ 8
  7. ทีนี้ลองลบโฟลเดอร์หรือไฟล์

4
มันน่าสนใจที่จะทราบว่าไฟล์ลึกลับเหล่านั้นมาจากไหน
John WH Smith

9

ฉันมีปัญหาเดียวกันนี้สร้างหนึ่งซับเริ่มต้นด้วยคำแนะนำ @camh:

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

awkคำสั่งคว้า PIDs tailคำสั่งได้รับกำจัดของรายการแรกที่น่ารำคาญ "PID" ฉันเคย-9ฆ่าคนอื่นอาจมีตัวเลือกที่ปลอดภัยกว่า


1
เพื่อให้เป็นสากลมากขึ้นคุณสามารถใช้. / สำหรับไดเรกทอรีปัจจุบันแทนบันทึก /
user2589273

จุดดี @ ผู้ใช้ 2589273 Updated
Choylton B. Higginbottom

5

ฉันมีปัญหานี้เมื่อการทดสอบอัตโนมัติสร้าง ramdisk คำสั่งที่แนะนำในคำตอบอื่น ๆlsofและfuserก็ไม่ได้ช่วยอะไร หลังจากการทดสอบฉันพยายามที่จะยกเลิกการต่อเชื่อมแล้วลบโฟลเดอร์ ฉันสับสนมากสำหรับทุกเพศทุกวัยเพราะฉันไม่สามารถกำจัดมันได้ - ฉันได้รับ"อุปกรณ์หรือทรัพยากรไม่ว่าง" !

ฉันพบวิธีกำจัด ramdisk โดยบังเอิญ ฉันต้องยกเลิกการต่อเชื่อมจำนวนครั้งเดียวกับที่ฉันเรียกใช้mountคำสั่งนั่นคือ sudo umount path

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

หวังว่านี่จะช่วยคนที่เจอปัญหานี้ได้!


5

ฉันพบสิ่งนี้บ่อยครั้งในเซิร์ฟเวอร์ที่มีระบบไฟล์เครือข่าย NFS ฉันสมมติว่ามันมีบางอย่างที่เกี่ยวข้องกับระบบไฟล์เนื่องจากไฟล์มักจะมีชื่อ.nfs000000123089abcxyzดังนี้

โซลูชันทั่วไปของฉันคือเปลี่ยนชื่อหรือย้ายไดเรกทอรีหลักของไฟล์จากนั้นกลับมาอีกครั้งในหนึ่งหรือสองวันและไฟล์จะถูกลบออกโดยอัตโนมัติ ณ จุดนี้ฉันมีอิสระที่จะลบไดเรกทอรี

ซึ่งมักเกิดขึ้นในไดเรกทอรีที่ฉันกำลังติดตั้งหรือรวบรวมไลบรารีซอฟต์แวร์


4

การกระโดดออกจากคำถามของ Prabhat ด้านบนฉันมีปัญหานี้ใน macos high sierra เมื่อฉันติดกระบวนการเข้ารหัสการรีบูตเครื่องแก้ไขได้ แต่สิ่งนี้

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

แสดงให้ฉันเห็นกระบวนการและ PID (คอลัมน์ที่สอง)

sudo kill -15 pid-here

ซ่อมมัน.


มันก็ใช้ได้กับฉันเช่นกัน อะไรนะ-15?
O.rka

3

หากคุณมีเซิร์ฟเวอร์ที่สามารถเข้าถึงได้ลอง

การลบ dir นั้นจากเซิร์ฟเวอร์

หรือทำumountและmountอีกครั้งลองumount -l: lazy umount หากประสบปัญหาใด ๆ ใน umount ปกติ

ฉันก็มีปัญหาเช่นนี้ที่

lsof +D path : ไม่ให้ผลลัพธ์

ps -ef : ไม่ให้ข้อมูลที่เกี่ยวข้อง

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