Saya memiliki file log yang tumbuh besar. Informasi yang saya dapat darinya dapat diabaikan.
Saya ingin menautkannya ke /dev/null
. Namun, meskipun "dihapus" (lihat di bawah output lsof), itu menghabiskan semua ruang hard disk saya.
Saya dapat memotongnya menggunakan:
: > "/proc/$pid/fd/$fd"
# for instance:
: > "/proc/2456/fd/2"
Sayangnya, ada proses pada sistem yang dijeda saat hard disk penuh, dan harus dimulai ulang secara manual (dan saya ingin menghindari proses yang dijeda).
Apakah ada cara untuk memotong file secara otomatis ketika menjadi terlalu besar (misalnya ketika mengkonsumsi lebih dari 1G?)
lsof
keluaran:
program 2456 user 2w REG 8,5 441433300992 0 21365598 /home/user/file (deleted)
Jawaban yang Diterima:
Konten file hanya dihapus ketika tidak ada referensi lagi. Referensi ke file dapat berupa entri direktori atau pegangan file terbuka. Saat Anda menghapus file (mis. dengan rm
perintah) bahwa suatu proses masih terbuka (di sini, proses yang masuk ke dalamnya), konten file tetap ada sampai proses menutup file.
Cara paling mudah untuk menghapus log lama adalah dengan
- Pindahkan file ke nama lain, mis.
mv foo.log foo.log.old
- Instruksikan proses untuk membuka kembali file lognya. Jika proses tidak memiliki cara untuk melakukannya, mulai ulang.
- Hapus file log lama yang sekarang ditutup (
rm foo.log.old
).
Program logrotate mengotomatiskan mekanisme ini dan dapat dikonfigurasi untuk berapa hari log lama disimpan. Itu juga dapat mengompresi log lama.
Untuk langkah 2, jika Anda tidak dapat me-restart program dan tidak memiliki cara untuk membuka kembali file log-nya, Anda dapat mencoba membuatnya membuka kembali file log dengan debugger. Namun, berhati-hatilah karena ini dapat membuat program macet jika menyimpan informasi tentang file log yang sekarang menjadi tidak konsisten. Bukti konsep (hati-hati karena banyak hal bisa salah dengan ini; jika ragu, jangan lakukan):
gdb -n $pid -batch -x /dev/stdin <<EOF
call close(2)
call open("/path/to/foo.log", 1)
EOF
Metode kasar alternatif untuk mengosongkan beberapa ruang disk jika Anda tidak peduli dengan log apa pun adalah dengan memotong file. Proses logging akan tetap menulis pada posisi yang sama dalam file, tetapi file tersebut akan menjadi file sparse. Jika Anda membaca dari awal file, Anda akan mendapatkan byte nol, tetapi byte nol ini hanya menempati beberapa kB di disk.
dd if=/dev/null of=/path/to/foo.log