Dosyayı / dev / null dizinine kopyalayın.


32

Log.txt dosyasına yazan bir uygulamayı çalıştırıyorum. Uygulama, desteklenen eklentileri artık uyumlu hale getirmeden yeni bir sürüme güncellendi. Log.txt dosyasına büyük miktarda hata zorlar ve farklı bir log dosyasına yazmayı desteklemiyor gibi görünmektedir.

Onları farklı bir günlüğe nasıl yazabilirim?

Log.txt 'i bir hard link ile değiştirmeyi düşündüm (uygulama farkı doğru söyleyemez mi?) Veya / dev / null' a işaret eden bir hard link. Seçeneklerim neler?


Sadece yapamaz chmod -w log.txtmısın?
user168715,

Yanıtlar:


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

Sağ büyük ve küçük dev numaraları ile bu kopyalar boş cihaz log.txtBaşka var bu yüzden null.

Cihazlar çekirdekte adıyla değil, ana ve küçük sayılarıyla bilinir. Hangi işletim sistemine sahip olduğunuzu bilmediğim için, sadece bildiğimiz yerden numaraları kopyalamayı uygun buldum. Yanlış büyük ve küçük sayılarla yaparsanız, büyük olasılıkla başka bir cihaz, belki bir disk veya yazmak istemediğiniz bir şey yapmış olabilirsiniz.


4
Bu komutun gerektirdiğini sudo(veya root kullanıcısı olarak çalıştığınızı) belirtmekte fayda var . Lütfen (cevabınızda) ne demek istediğinizi "doğru majör ve minör dev sayılar" ile açıklayın.
mklement0

3
(OP değilim.) Güncellemeyi takdir ediyorum, ancak /dev/nullkomut satırında kullanıldığı gibi "büyük ve küçük sayılar" ın dosya yoluyla ne kadar ilgili olduğu konusunda hala kafam karıştı . Ve bunun nota gelecek okuyucuların yardımcı olacağını düşünüyorum Yanıtınızdasudo gereklidir.
mklement0

1
@wallyk: Teşekkürler, bilmek gerçekten güzel. Ancak benim açımdan: cp -a /dev/null log.txtYorumlar ve yorumlarımla ilgili olarak nasıl ortaya çıktı ?
mklement0

1
@MALON: Gerçekten de hallettin ve Ubuntu 14.04 üzerinde size do ihtiyaç sudoEğer kullanıcı olarak çalışıyor olması gelmiyorsa, bu komutu gerçekleştirmek için root(genellikle tavsiye edilmez olan). Bir hard link (bu cevap) veya bir symlink (@ V.Michel'in cevabı) oluşturmak için sudo(veya farklı olarak çalışan root) kullanmak , dosyanın herhangi bir kullanıcı hesabının yazabileceği bir yere yerleştirilmesi gerekiyorsa, sonuçta doğru çözüm olabilir. Ancak mesele şu ki: bu şartı açıkça not alın.
mklement0

1
Not: Büyük, küçük yorumların muhtemelen kullanımı öneren soru hakkında bir yorum ile ilgili olduğunu biliyorum mknod. Yorumların genel olarak çok az dikkat çektiğini unutmayın, bu nedenle yalnızca soruyu okuyan biri ve ardından cevabınız karışabilir (ben de; çoğu insanın asla büyük ve küçük cihaz numaraları gibi kavramlara maruz kalmadığını unutmayın).
mklement0

65

/ Dev / null ile sembolik bir bağlantı kurabilirsiniz ve root olmanız gerekmez:

ln -s /dev/null log.txt

Bu aynı zamanda kendi kendini belgeleme avantajına sahiptir, ls -l log.txtçünkü bunun, örneğin "1, 3" ün bir şekilde önemli olduğunu bilmek yerine, / dev / null ile bir bağ olduğunu gösterir.
Monty Harder

14

Buradaki diğer cevaplar muhtemelen işe yarayacak. Özellikle, sembolik bağlantı çözümü muhtemelen en kolay çözüm olacaktır. Bunu esas olarak bütünlük için yapıyorum.

Dosyayı içeren dosya sistemi aygıtları desteklemiyorsa (veya örneğin, seçenekle monte edilmişse), mknod(veya cp -a) içeren çözümler sorunlu hale gelir nodev. Ve elbette, dosya sistemlerindeki sabit bağlantılar işe yaramaz.

Sabit bağlantılara veya yeni aygıt düğümleri oluşturmaya alternatif bir dosya veya dizini dosya sistemi ağacınızın bir bölümünden diğerine eklemenize izin veren bağlama bağları kullanmaktır. Yani, örneğin, çalıştırabilirsiniz:

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

Bu çok sert bir bağlantı gibi davranır, ancak:

  • Dosya sistemlerinde çalışabilir (çünkü sabit bağlantı gibi dosya sistemi düğümlerine dayanmaz)
  • Salt okunur dosya sistemlerinde çalışır (çünkü aslında dosya sistemini değiştirmezsiniz)

Tam bir örnek için:

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

Ancak yalnızca bağlama montajı olan sistemlerde çalışır. (Modern Linux gibi)
reinierpost

Bir günlük dosyası zaten salt okunur bir dosya sistemine ait olmaz.
Monty Harder

1
Salt okunur bir dosya sisteminde tek bir dosyaya yazmak istediğinizde kendinizi ne sıklıkta bulmakta şaşırırsınız. Ve bir nodevdosya sisteminde çok iyi olabilir .
Aralık'ta

6

Uygulama, log.txt dosyasını NASIL ele aldığına kritik derecede bağlıdır.

Eğer uygulama sadece mevcut dosyayı açarsa ve ona yazarsa, diğer cevaplarda açıklandığı şekilde, onu / dev / null ile işaretleyebilir, başka bir yere işaretleyebilir, başka bir yere sabitleyebilirsiniz (hardlinks çapraz dosya sistemi olamaz, bu yüzden yok ' t) Bu noktada bir çok nokta var) / dev / null aygıt düğümünün bir kopyasını orada yarat vs.

OTOH, uygulama silinir ve yeniden oluşturulursa log.txt, hiçbiri işe yaramaz. Yazmaları farklı bir dosya sistemine yönlendirmek için tüm dizini başka bir yere bağlayabilirsiniz, ancak bununla ilgili ve dizindeki diğer şeylerle uğraşmak zorunda kalacaksınız.

Sanırım gerçekten isterseniz, çoğu işlemi geçen ve log.txt adlı bir dosya oluşturma girişimlerini atarken özel bir kaplama dosya sistemi oluşturabilirsiniz.


chattr +i log.txtilk kez ve uygulama artık dosyayı silmez.
Marco Marsala

3

Pip adı verilen nankörce bir yöntem.

# 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

Neredeyse süzülmüş ya da nc üzerinden gönderme gibi atılan kayıt defteriyle neredeyse her şeyi yapabilirsiniz .


Eğer catsüreç öldürülürse veya kilitlenirse, giriş borusu dolduğunda giriş programı kilitlenir.
Marco Marsala

-1

Dosyayı gerçek bir boş aygıt yapmayı düşünün. Mknod ile oluşturulan "log.txt" dosyası, doğru dosya türünde ve aynı küçük ve büyük sayılarla boş bir aygıt olarak işlev görür.


Bu, başkalarının söylediklerine hiçbir şey eklemez.
Kusalananda
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.