Büyük bir dosyayı kesmek için Unix kabuk betiği


87

Bir uygulama tarafından sürekli olarak yazılan / açılan bir dosyayı 3GB gibi bir alana ulaştığında kesecek / boşaltacak bir Unix betiği yazmaya çalışıyorum. Aşağıdaki komutun bunu yapacağını biliyorum:

cp /dev/null [filename]

Ama bunu bir üretim ortamında otomatik olarak bir cron işi olarak çalıştıracağım - sadece buna benzer bir şey yaparken herhangi bir sorunla karşılaşıp karşılaşmadığınızı görmek için buraya yazıyorum.


Bunlar ürün. günlüklerin değeri yok mu? Üretim günlüklerimi bir yıl + (bzip2 -9 fmt olarak) tuttuğum için şanslıydım ve iş çalışma sürelerini, işlenen kayıtları çıkarmayı kolaylaştıran ve bir elektronik tabloya yüklendiğinde hesaplaması ve grafik yükleme oranlarını kolayca çıkaran birkaç küçük yardımcı programım vardı ve bir sürü şey. Düşen yük oranları nedeniyle bir hdwr sorunu keşfettik. Evet, orada güzel izleme araçları var, bu yüzden hepsi sizin durumunuza bağlı. AYRI BİR SEÇENEK OLARAK, baktınız mı logrotate, size bir değer sağlayabilir (ancak onu kurmaktan rahatsız olabilir (sadece tahmin etmek)!).
shellter

5
Günlük dosyası O_APPEND bayrağıyla açılırsa, kesme işleminin etkili olacağını unutmayın. O_APPEND bayrağıyla açılmadıysa, program ofset 3 GiB'de yazmaya devam edecektir (ilk kez); sistem ilk 3 GiB'yi tamamen bayt-sıfır olarak değerlendirecek (bu da iyi sıkıştırır), ancak dosya büyümeye devam edecektir. Her şey günlüğü yazan programa bağlıdır.
Jonathan Leffler

Yanıtlar:


116

Sadece başka bir cevap eklemek için

: > filename

: bash'de işlemsizdir (POSIX uyumlu), bu nedenle bu, esasen dosyayı yazmak için açar (tabii ki dosyayı keser) ve ardından hemen kapatır.

DÜZENLEME: Shellter'ın söylediği gibi, yeniden yönlendirme ile birlikte gitmek için aslında bir komuta ihtiyacınız yok:

$ echo foo > foo.txt
$ cat foo.txt
foo
$ > foo.txt
$ cat foo.txt
$

Tek başına basit bir yeniden yönlendirme dosyayı temizleyecektir.


25
veya sadece > filename(bildiğinizden emin olduğum gibi). Hepinize iyi şanslar.
shellter

5
@shelter "$> dosya" POSIX değil ve taşınabilir değil. Yeniden yönlendirmeden önce, başlangıçta önerildiği gibi ":" no-op komutunu kullanmalısınız.
Aaron Toponce

2
+ gülen yüz için artı
Chris Suszyński

2
@AaronToponce açıklandığı gibi, "$> dosya" gerçekten taşınabilir değildir; Zsh kurulumumda kabuğun askıda kalmasını sağlıyor (sözde girdi bekliyor). "$:> dosya" Zsh'da gayet iyi çalışıyor.
Linus Arver

1
@TechEnthusiast Beklentinize bağlıdır. Kesmenin kendisi atomiktir, ancak herhangi bir yazıma göre ne zaman olacağını gerçekten bilemezsiniz. Örneğin, dosyanın başlangıcında kısmi bir satır yazabilirsiniz.
chepner

66

Debian'da aşağıdaki komutu kullandım

truncate -s 0 filename

@SteveClay: sudo sh -c ': > filename'ayrıca kısaltacakfilename
Perleone

2
OP öneri de birlikte sorunsuz çalışır @SteveClay sudo: sudo cp /dev/null filename. Ayrıca sadece modern Linux cpiken taşınabilir truncate.
Tino

11

Bu bana mantıklı geliyor. Elbette Unix bunu yaklaşık 50 farklı şekilde yapmanıza izin verirdi. Örneğin,

echo -n "" >filename
cat /dev/null >filename

2

trunc filename

UNIX'in AIX çeşidinde çalışır

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.