GNU/Linux >> Belajar Linux >  >> Linux

Bagaimana Menghubungkan File Log Ke /dev/null Dan Mengembalikan Ruang yang Digunakan Secara Otomatis?

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

  1. Pindahkan file ke nama lain, mis. mv foo.log foo.log.old
  2. Instruksikan proses untuk membuka kembali file lognya. Jika proses tidak memiliki cara untuk melakukannya, mulai ulang.
  3. 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

Linux
  1. Bagaimana Linux Menangani Beberapa Pemisah Jalur Berturut-turut (/home////username///file)?

  2. Seberapa Portabel /dev/stdin, /dev/stdout Dan /dev/stderr?

  3. Bagaimana Membungkam Sepenuhnya Cronjob Ke /dev/null/?

  1. Cara memetakan perangkat /dev/sdX dan /dev/mapper/mpathY dari perangkat /dev/dm-Z

  2. Kapan saya harus menggunakan /dev/shm/ dan kapan saya harus menggunakan /tmp/?

  3. Bagaimana cara mengubah jumlah dan ukuran ramdisk Linux (/dev/ram0 - /dev/ram15)?

  1. Linux:Perbedaan antara /dev/console , /dev/tty dan /dev/tty0

  2. kernel:menonaktifkan /dev/kmem dan /dev/mem

  3. Bagaimana Linux menggunakan /dev/tty dan /dev/tty0