การลบไฟล์คนพเนจรฉันเห็น. nfs0000000000b869e300000001


15

ฉันลบไฟล์และตอนนี้ฉันเห็น:

$ ls
total 64
-rw-rw-r-- 1 502 17229 Sep 17 16:42 page_object_methods.rb
drwxrwxr-x 7 502   238 Sep 18 18:41 ../
-rw-rw-r-- 1 502 18437 Sep 18 18:41 new_page_object_methods.rb
-rw-r--r-- 1 502 16384 Sep 18 18:42 .nfs0000000000b869e300000001
drwxrwxr-x 5 502   170 Sep 21 13:48 ./
13:48:11 *vagrant* ubuntu-14 selenium_rspec_conversion

และถ้าฉันพยายามที่จะลบมัน:

$ rm .nfs0000000000b869e300000001
rm: cannot remove ‘.nfs0000000000b869e300000001’: Device or resource busy

สิ่งนี้บ่งบอกอะไร ฉันควรทำอย่างไรดี


ปัญหานี้เมื่อรวมกับบั๊ก - บริการเสียงตัวบ่งชี้นี้ที่กระบวนการ 100s เปิดไฟล์อยู่รวมกับ isues เช่น นี้โดยที่ไฟล์บันทึก ~ / .cache / upstart เติบโตใหญ่มากและถูกบีบอัดแล้ว ไดรฟ์ NFS ขององค์กรที่มีไดเรกทอรีบ้านของฉัน ทำงานรอบได้โดยการเพิ่มการps -Af | grep 'indicator-services-start' | awk '{ print $2 }' | xargs kill crontab -e
Andres Riofrio

คำตอบ:


14

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

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

รวมสองอย่างเข้าด้วยกัน: จะเกิดอะไรขึ้นเมื่อไคลเอนต์เปิดไฟล์และลบออก? ไฟล์ต้องมีชื่อต่อไปเพื่อให้ไคลเอ็นต์ที่เปิดอยู่ยังคงสามารถเข้าถึงได้ แต่เมื่อไฟล์ถูกลบคาดว่าจะไม่มีไฟล์ตามชื่อนั้นอีกต่อไป ดังนั้นเซิร์ฟเวอร์ NFS จะเปลี่ยนการลบไฟล์ที่เปิดเป็นการเปลี่ยนชื่อไฟล์จะถูกเปลี่ยนชื่อเป็น.nfs…( .nfsตามด้วยสตริงตัวอักษรและตัวเลข)

คุณไม่สามารถลบไฟล์เหล่านี้ (ถ้าคุณลองสิ่งที่เกิดขึ้นคือไฟล์ใหม่.nfs…จะปรากฏขึ้นพร้อมคำต่อท้ายที่ต่างออกไป) ในที่สุดพวกเขาจะหายไปเมื่อไคลเอนต์ที่เปิดไฟล์ปิดอยู่ (หากลูกค้าหายไปก่อนปิดไฟล์อาจใช้เวลาสักครู่จนกว่าเซิร์ฟเวอร์จะสังเกตเห็น)


2

User @mtak สำหรับคำถามอื่นแนะนำ:

You could try runningfuser /path/to/.nfsto check which process is using the .nfs file. – mtak May 2 '14 at 9:13

^^^^^ ใช้งานได้ ^^^^^ และฆ่ากระบวนการที่ทำให้ขุ่นเคืองเพื่อให้ปล่อยมือจับไฟล์

เช่น

$ rm -rf ~/Downloads
rm: cannot remove ‘/nfshome/x/Downloads’: Directory not empty
$ ls -alstr ~/Downloads
total 38864
  972 -rw-r--r--   1 x users   988438 Dec 20  2016 .nfs00000000018d307a00000369
31812 -rw-r--r--   1 x users 32503812 Dec 20  2016 .nfs00000000018d307f0000036b
  636 drwx--x--x 134 x y   647168 Aug 28 10:37 ..
  240 drwxr-xr-x   2 x y   241664 Aug 28 10:43 .
$ rm -rf ~/Downloads
rm: cannot remove ‘/na-homes/x/Downloads/.nfs00000000018d307a00000369’: Device or resource busy
rm: cannot remove ‘/na-homes/x/Downloads/.nfs00000000018d307f0000036b’: Device or resource busy

$ fuser /nfshome/x/Downloads/.nfs00000000018d307400000367
/nfshome/x/Downloads/.nfs00000000018d307400000367:  8231m
$ ps -elf |grep 8231
0 S x     1493 15153  0  80   0 - 28177 pipe_w 10:55 pts/39   00:00:00 grep --color=auto 8231
0 S x     8231  7660  0  99   - - 481464 poll_s Jul19 ?       00:06:01 /usr/libexec/tracker-extract
$ kill 8231
$ kill 8231 # kill twice to check first kill worked, . . 
            # escalate to kill -9 8231 if first kill didn't work, . . 
            # use sudo or root or other user to kill if ownership prevents kill working.
-bash: kill: (8231) - No such process
$ rm -rf ~/Downloads

$ ls -alstr ~/Downloads/
ls: cannot access /nfshome/x/Downloads/: No such file or directory

เย้! ความสำเร็จ

แน่นอน YMMV อาจเป็นกระบวนการอื่นที่เปิดไฟล์อยู่

กระบวนการแยกตัวติดตามถูกรีสตาร์ทโดยอัตโนมัติหลังจากที่ฉันฆ่ามัน

อะไรคือตัวแยกติดตามสิ่งนี้ (ฉันเห็นสิ่งนี้ใน centos / redhat)

/programming/26737900/tracker-extract-and-tracker-store-processes-consuming-huge-amount-of-ram

extra/tracker 1.2.3-1 (gnome)
    All-in-one indexer, search tool and metadata database

1
มีประโยชน์มากกว่าคำตอบที่ยอมรับเนื่องจากให้วิธีการแก้ไขสถานการณ์แก่ผู้ใช้
chb

1

เนื่องจาก NFS เป็น "ไร้สัญชาติ" จึงจำเป็นต้องมีวิธีการเลียนแบบวิธี UNIX ในการเปิดไฟล์

การดำเนินการกับไฟล์ NFS ใด ๆ ที่ทำให้เชน:

open(); seek-last-off(); doit(); close();

ที่จะถูกเรียกใช้และนี่คือเหตุผลที่ NFS ยังมีชีวิตอยู่ในการรีบูตเซิร์ฟเวอร์

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

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


0

กระบวนการอื่นมีแนวโน้มที่จะยังคงใช้ไฟล์อยู่ (นั่นคือมีการเปิดไฟล์อ้างอิง) ไม่ต้องสนใจไฟล์หรือใช้lsofหรือพยายามที่จะค้นหาว่ากระบวนการใดที่ไฟล์นั้นเปิด (หรือรีบูตทุกอย่าง!)


0

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

ป.ล. คำตอบของฉันใช้ได้เฉพาะฉากที่ฉันระบุเท่านั้น

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