Ganti file dengan tautan keras ke / dev / null

32

Saya menjalankan aplikasi yang menulis ke log.txt. Aplikasi diperbarui ke versi baru, membuat plugin yang didukung tidak lagi kompatibel. Itu memaksa sejumlah besar kesalahan ke log.txt dan tampaknya tidak mendukung penulisan ke file log yang berbeda.

Bagaimana saya bisa menulisnya ke log yang berbeda?

Saya telah mempertimbangkan untuk mengganti log.txt dengan tautan keras (aplikasi tidak dapat membedakannya, bukan?) Atau tautan keras yang menunjuk ke / dev / null. Apa saja pilihan saya?

MALON
sumber
Anda tidak bisa adil chmod -w log.txt?
user168715

Jawaban:

30
# cp -a /dev/null log.txt

Ini menyalin perangkat nol Anda dengan angka dev utama dan minor yang tepat log.txtsehingga Anda memiliki yang lain null.

Perangkat sama sekali tidak dikenal namanya di dalam kernel melainkan oleh nomor utama dan minor mereka. Karena saya tidak tahu OS apa yang Anda miliki, saya merasa nyaman untuk hanya menyalin angka dari tempat yang sudah kami ketahui. Jika Anda membuatnya dengan nomor mayor dan minor yang salah, kemungkinan besar Anda telah membuat beberapa perangkat lain, mungkin disk atau sesuatu yang tidak ingin Anda tulis.

Joshua
sumber
4
Perlu dicatat bahwa perintah ini membutuhkan sudo(atau berjalan sebagai pengguna root). Tolong jelaskan (dalam jawaban Anda) apa yang Anda maksud dengan "angka dev utama dan minor yang tepat".
mklement0
3
(Saya bukan OP.) Saya menghargai pembaruan, tapi saya masih bingung tentang bagaimana "angka besar dan kecil" berhubungan dengan path file /dev/null, seperti yang digunakan dalam perintah Anda. Dan, saya pikir itu akan membantu pembaca masa depan untuk mencatat jawaban Anda yang sudodiperlukan.
mklement0
1
@wallyk: Terima kasih, itu memang baik untuk diketahui. Tetapi poin saya adalah: Bagaimana cara bermain sehubungan dengan cp -a /dev/null log.txtdan komentar saya?
mklement0
1
@MALON: Memang Anda lakukan, dan pada Ubuntu 14.04 Anda tidak perlu sudountuk melakukan perintah ini, kecuali Anda kebetulan berjalan sebagai pengguna root(yang umumnya berkecil). Menggunakan sudo(atau menjalankan sebagai root) untuk membuat tautan keras (jawaban ini) atau symlink (jawaban @ V.Michel) mungkin merupakan solusi yang tepat, jika file tersebut harus ditempatkan di lokasi yang dapat ditulisi oleh akun pengguna mana pun , tetapi intinya adalah: perhatikan persyaratan itu secara eksplisit.
mklement0
1
PS: Saya tahu bahwa komentar utama, minor mungkin berhubungan dengan komentar pada pertanyaan yang merekomendasikan penggunaan mknod. Perhatikan bahwa komentar pada umumnya hanya mendapat sedikit perhatian, sehingga seseorang hanya membaca pertanyaan dan kemudian jawaban Anda mungkin bingung (seperti juga saya; perhatikan juga bahwa kebanyakan orang tidak pernah terpapar konsep seperti nomor perangkat utama dan kecil).
mklement0
65

Anda dapat membuat tautan simbolis ke / dev / null dan Anda tidak perlu menjadi root:

ln -s /dev/null log.txt
V. Michel
sumber
Ini juga memiliki keuntungan mendokumentasikan diri sendiri, karena hal itu ls -l log.txtakan menunjukkan bahwa itu adalah symlink ke / dev / null, daripada mengandalkan mengetahui bahwa misalnya "1, 3" entah bagaimana signifikan.
Monty Harder
14

Jawaban lain di sini mungkin akan berfungsi. Secara khusus, solusi symlink mungkin akan menjadi solusi termudah. Saya menawarkan ini terutama untuk kelengkapan.

Solusi yang melibatkan mknod(atau cp -a) menjadi bermasalah jika sistem file yang berisi file tidak mendukung perangkat (misalnya, sudah terpasang dengan nodevopsi, misalnya). Dan tentu saja, tautan keras antar sistem file tidak akan berfungsi.

Alternatif untuk tautan keras atau membuat simpul perangkat baru adalah dengan menggunakan bind mounts, yang memungkinkan Anda memasang file atau direktori dari satu bagian dari susunan sistem file Anda ke yang lain. Jadi, misalnya, Anda dapat menjalankan:

mount -o bind /dev/null /path/to/log.txt

Ini sangat mirip dengan tautan keras, tetapi:

  • Itu dapat beroperasi di seluruh filesystem (karena itu tidak didasarkan pada inode filesystem seperti hard link)
  • Ini bekerja pada sistem file read-only (karena Anda sebenarnya tidak memodifikasi sistem file)

Untuk contoh lengkap:

bash-4.3# ls -l /var/log/boot.log
-rw-r--r--. 1 root root 7436 Dec 19 10:00 /var/log/boot.log
bash-4.3# mount -o bind /dev/null /var/log/boot.log
bash-4.3# ls -l /var/log/boot.log
crw-rw-rw-. 1 root root 1, 3 Dec 19 09:58 /var/log/boot.log
bash-4.3# echo words words words > /var/log/boot.log
bash-4.3# ls -l /var/log/boot.log
crw-rw-rw-. 1 root root 1, 3 Dec 19 09:58 /var/log/boot.log
larsks
sumber
Tetapi ini hanya bekerja pada sistem yang memiliki bind mount. (Seperti Linux modern.)
reinierpost
File log tidak akan termasuk dalam sistem file read-only.
Monty Harder
1
Anda akan terkejut betapa seringnya Anda ingin menulis ke satu file pada sistem file read-only. Dan itu mungkin ada di nodevsistem file.
larsks
6

Itu sangat tergantung pada BAGAIMANA aplikasi menangani log.txt.

Jika aplikasi hanya membuka file yang sudah ada dan menulisnya kemudian seperti yang dijelaskan dalam jawaban lain Anda dapat symlink ke / dev / null, symlink di tempat lain, hardlink di tempat lain (meskipun hardlink tidak dapat lintas sistem file sehingga tidak ada t banyak poin dalam hal ini) buat salinan / dev / null device node di sana dll.

OTOH jika aplikasi menghapus dan membuat ulang log.txt tidak ada yang berfungsi. Anda dapat menghubungkan seluruh direktori di tempat lain untuk mengarahkan ulang penulisan ke sistem file yang berbeda tetapi itu saja dan Anda harus berurusan dengan hal-hal lain dalam direktori.

Saya kira jika Anda benar-benar ingin, Anda dapat membuat filesystem overlay khusus yang melewati sebagian besar operasi sekaligus membuang semua upaya untuk membuat file bernama log.txt.

plugwash
sumber
chattr +i log.txtpertama kali dan aplikasi tidak akan menghapus file lagi.
Marco Marsala
3

Nah, satu metode tidak berterima dengan pipa bernama :

# create a named pipe
mkfifo /path/to/log.txt
# read contents from the pipe and redirect them to /dev/null
cat /path/to/log.txt > /dev/null

Anda hampir dapat melakukan apa saja dengan log yang dibuang, seperti filter atau kirim nc .

pengguna3824053
sumber
Jika catproses terbunuh atau macet, program login akan hang ketika pipa penuh.
Marco Marsala
-1

Pertimbangkan untuk menjadikan file sebagai perangkat null yang sebenarnya. File "log.txt" dibuat dengan mknod, dengan tipe file yang tepat dan angka minor dan mayor yang sama, akan bertindak sebagai perangkat null karena itu.

pemeras
sumber
Ini tidak menambah apa pun yang dikatakan orang lain.
Kusalananda