Saya menggunakan RAM untuk tmpfs / tmp saya, 2GB, tepatnya. Biasanya, ini sudah cukup tetapi kadang-kadang, proses membuat file di sana dan gagal untuk membersihkan sendiri. Ini bisa terjadi jika mereka crash. Saya perlu menghapus file-file tmp yatim ini atau proses selanjutnya akan kehabisan ruang di / tmp.
Bagaimana saya bisa dengan aman mengumpulkan / tmp sampah? Beberapa orang melakukannya dengan memeriksa cap waktu modifikasi terakhir, tetapi pendekatan ini tidak aman karena mungkin ada proses yang berjalan lama yang masih membutuhkan file-file itu. Pendekatan yang lebih aman adalah menggabungkan kondisi timestamp modifikasi terakhir dengan kondisi bahwa tidak ada proses yang memiliki pegangan file untuk file tersebut. Apakah ada program / skrip / etc yang mewujudkan pendekatan ini atau pendekatan lain yang juga aman?
Secara kebetulan, apakah Linux / Unix memungkinkan mode pembukaan file dengan kreasi di mana file yang dibuat dihapus ketika proses pembuatan berakhir, bahkan jika itu dari crash?
sumber
Jawaban:
Anda mungkin ingin mencoba sesuatu seperti itu:
find /tmp -mtime +7 -and -not -exec fuser -s {} ';' -and -exec echo {} ';'
find digunakan untuk menemukan file yang sesuai dengan kriteria tertentu.
-mtime +7
hanya memilih file yang lebih lama dari 7 hari (Anda dapat menggunakan nilai lain)-exec fuser -s {} ';'
memanggil fuser dalam mode senyap untuk setiap file yang cocok dengan kriteria ketuaan. fuser mengembalikan 0 (= true) untuk setiap file yang telah diakses saat ini dan 1 (= false) untuk yang belum diakses. Karena kami hanya tertarik pada yang belum diakses, kami menempatkan-not
di depan ini-exec
-exec echo {} ';'
cukup cetak semua nama file yang cocok dengan kriteria. Anda mungkin ingin menggunakannya di-exec rm {} ';'
sini, tetapi karena ini dapat menghapus beberapa file yang masih digunakan, saya pikir lebih aman untuk melakukan gema sederhana terlebih dahulu.-name 'foo*.bar'
atau-uid 123
membatasi efek pembersihan ke pola file atau ID pengguna tertentu untuk menghindari efek yang tidak disengaja.Ke poin terakhir: Pertimbangkan bahwa mungkin ada file yang hanya ditulis sekali (misalnya pada boot sistem) tetapi sering membaca (misalnya cookie X-sesi apa pun). Karena itu saya sarankan menambahkan beberapa pemeriksaan nama hanya mempengaruhi file yang dibuat oleh program Anda yang salah.
sunting2: Untuk pertanyaan terakhir Anda: File tidak akan dihapus dari disk sampai tidak ada proses yang memiliki pegangan terbuka (setidaknya untuk sistem file linux asli). Masalahnya adalah bahwa entri direktori dihapus segera yang berarti bahwa sejak Anda menghapus file tidak ada proses baru dapat membuka file lagi (karena tidak ada nama file yang melekat padanya).
Untuk detail, lihat: /programming/3181641/how-can-i-delete-a-file-upon-its-close-in-c-on-linux
sunting3: Tetapi bagaimana jika saya ingin mengotomatiskan seluruh proses?
Seperti yang saya katakan, mungkin ada file yang ditulis sekali dan kemudian dibaca sesekali (misalnya cookie sesi X, file PID, dll.). Itu tidak akan dikecualikan oleh skrip penghapusan kecil ini (yang merupakan alasan mengapa Anda mungkin ingin melakukan uji coba
echo
terlebih dahulu sebelum benar-benar menghapus file).Salah satu cara untuk mengimplementasikan solusi yang aman adalah menggunakan
atime
.atime
menyimpan waktu setiap file diakses terakhir kali. Tapi opsi sistem file itu sering dinonaktifkan karena memiliki dampak kinerja yang cukup (menurut blog ini di wilayah 20-30%). Adarelatime
, tetapi yang satu itu hanya menulis waktu akses jikamtime
sudah berubah, jadi yang ini tidak akan membantu kita.Jika Anda ingin menggunakan
atime
, saya sarankan untuk memiliki/tmp
partisi yang terpisah (idealnya ramdisk) sehingga dampak kinerja pada keseluruhan sistem tidak terlalu besar.Setelah
atime
diaktifkan, yang harus Anda lakukan adalah mengganti-mtime
parameter pada baris perintah di atas dengan-atime
.Anda mungkin dapat menghapusnya
-not -exec fuser -s {} ';'
, tetapi saya akan menyimpannya di sana hanya untuk memastikan (jika aplikasi membuka file untuk jangka waktu yang lama).Tetapi perlu diingat untuk menguji perintah menggunakan
echo
sebelum Anda akhirnya menghapus hal-hal yang masih dibutuhkan sistem Anda!sumber
/tmp/
pembersihan 'lateral' )./tmp
berada di partisi yang terpisah (mis. Ramdisk), Anda dapat mengaktifkannyaatime
dan menggunakan-atime
parameterfind
.Jangan menggulung sendiri.
Debian / Ubuntu memiliki tmpreaper, mungkin juga tersedia di dist lain.
sumber
/etc/tmpreaper.conf
file tersebut, jika saya menetapkan keduanya/tmp
dan/var/tmp
sebagai direktori pembersihan, dapatkah Anda merekomendasikanTMPREAPER_TIME
parameter atau jumlah maksimum file tmp yang akan dihapus? Saya telah mendengar bahwa lebih baik menyimpan file lebih lama/var/tmp
daripada/tmp
file. Tetapi jika mereka hanya dapat diatur dengan usia maks yang sama, saya tidak tahu.Mengenai bagian terakhir dari pertanyaan Anda:
Meskipun saya tidak berpikir bahwa mode buka / kreasi 'delete-this-if-die-die' ada, suatu proses dapat langsung menghapus file secara aman setelah membuatnya, asalkan tetap menangani file yang dibuka. Kernel kemudian akan menyimpan file di disk dan segera setelah proses terakhir yang telah membuka file keluar (baik karena crash atau normal), ruang yang ditempati oleh file akan dibebaskan.
Untuk cara umum mengatasi masalah bahwa beberapa proses kadang-kadang tidak membersihkan / tmp, saya akan menyarankan untuk melihat mount namespaces, dijelaskan, misalnya di sini atau di sini . Jika proses yang dimaksud adalah daemon sistem, systemd dan fitur aslinya untuk memungkinkan sistem file pribadi / tmp mungkin menarik.
sumber
untuk GUI coba ini; http://bleachbit.sourceforge.net/
membersihkan dan menggosok. mode pratinjau.
sumber
Dapatkan daftar file yang lebih lama dari itu, kecualikan file yang dibuka oleh apa pun dari daftar itu:
lsof -n +D /tmp
: cari file yang terbuka di / tmpawk 'NR>1 {print $9}'
: cetak hanya kolom kesembilan dari output lsof, tidak termasuk headertr \\n \|
: ganti baris baru dengan bar (ATAU di egrep)egrep -v "foo|moo|bar"
: baris cetak TIDAK mengandung foo atau moo atau barsumber
Saya setuju dengan hal di atas, untuk menambahkannya - saya selalu menjalankan
lsof +L1 | grep tmp
dan mematikan atau memulai kembali proses yang menahan file tmp "dihapus": EXAMPLE-sumber
Anda hanya bisa melakukan
rm -rf /tmp/*
dan berharap tidak ada yang rusak ...sumber