Saya menghapus file dan sekarang saya melihat:
$ 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
dan jika saya mencoba untuk menghapusnya:
$ rm .nfs0000000000b869e300000001
rm: cannot remove ‘.nfs0000000000b869e300000001’: Device or resource busy
Apa artinya ini? Apa yang harus saya lakukan
ps -Af | grep 'indicator-services-start' | awk '{ print $2 }' | xargs kill
kecrontab -e
.Jawaban:
File dapat dihapus saat dibuka oleh suatu proses. Ketika ini terjadi, entri direktori dihapus, tetapi file itu sendiri (inode dan konten) tetap tertinggal; file hanya benar-benar dihapus ketika tidak memiliki lagi tautan dan tidak terbuka oleh proses apa pun.
NFS adalah protokol stateless: operasi dapat dilakukan secara independen dari operasi sebelumnya. Bahkan memungkinkan server untuk reboot, dan setelah kembali online, klien akan terus mengakses file seperti sebelumnya. Agar ini berfungsi, file harus ditunjuk dengan namanya, bukan dengan penanganan yang diperoleh dengan membuka file (yang server akan lupa ketika reboot).
Gabungkan keduanya: apa yang terjadi ketika file dibuka oleh klien, dan dihapus? File harus tetap memiliki nama, sehingga klien yang membuka masih dapat mengaksesnya. Tetapi ketika suatu file dihapus, diharapkan tidak ada lagi file dengan nama itu sesudahnya. Jadi server NFS mengubah penghapusan file yang terbuka menjadi penggantian nama: file diubah namanya menjadi
.nfs…
(.nfs
diikuti oleh serangkaian huruf dan angka).Anda tidak dapat menghapus file-file ini (jika Anda mencoba, semua yang terjadi adalah bahwa yang baru
.nfs…
muncul dengan akhiran yang berbeda). Mereka akhirnya akan pergi ketika klien yang memiliki file terbuka menutupnya. (Jika klien menghilang sebelum menutup file, mungkin perlu waktu hingga server pemberitahuan.)sumber
Pengguna @mtak pada pertanyaan lain menyarankan:
You could try running
fuser /path/to/.nfsto check which process is using the .nfs file. – mtak May 2 '14 at 9:13
^^^^^ Itu berhasil ^^^^^ Dan matikan proses yang menyebabkannya untuk melepaskan pegangan file.
misalnya
YAY! Keberhasilan.
YMMV tentu saja. Mungkin proses yang berbeda duduk dengan file terbuka.
Proses ekstrak pelacak dimulai kembali secara otomatis setelah saya membunuhnya.
Apa hal pelacak-ekstrak ini? (Saya melihat ini di centos / redhat)
/programming/26737900/tracker-extract-and-tracker-store-processes-consuming-huge-amount-of-ram
sumber
Karena NFS adalah "stateless", perlu ada cara untuk meniru metode UNIX membuka file dan kemudian menghapusnya dengan menjaga filehandle terbuka.
Setiap operasi file NFS menyebabkan rantai:
open(); seek-last-off(); doit(); close();
untuk dijalankan dan ini adalah alasan mengapa NFS selamat dari reboot server.
Setelah proses pada klien yang membuka file lama berakhir, file tersebut akan hilang.
Server file yang diimplementasikan dengan benar akan menjalankan skrip setiap malam yang menghapus semua file yang lebih dari satu minggu. Alasannya adalah jika klien reboot saat memegang file seperti itu, file tersebut akan tetap selamanya.
sumber
Beberapa proses lain kemungkinan masih menggunakan file (yaitu, memiliki filehandle terbuka untuk itu). Abaikan file tersebut, atau gunakan
lsof
atau sejenisnya untuk mencoba menemukan proses apa yang membuat file itu terbuka (atau reboot semuanya!).sumber
Saya menghadapi situasi yang sama, tetapi dalam kasus saya, saya tidak dapat menghapus file yang dibuat oleh program saya sendiri. Saya yakin akan hal ini karena ada dalam direktori yang dibuat oleh program saya. Saya tidak tahu di mana dan kapan saya menjalankan program itu. Solusi: Saya cukup keluar dari semua terminal saya. Saya login lagi dan cukup menghapus file.
PS Jawaban saya hanya valid untuk scenerio yang telah saya tentukan.
sumber