Bir kabuk komut dosyası düzeyinde dosya boyutunu (stdout) sınırlamanın kolay yolu?


10

Tamam, bu benim açımdan çok pratik bir durum.

Diyelim ki çıktıyı bir dosyaya kaydeden basit bir kabuk oneliner'im var. Bu basitçe herhangi bir şey olabilir, örneğin tcpdump. Çıktı dosyasının verilen boyutu aşmayacağından emin olmak için genel ve önemsiz bir yol var mı?

Bunun arkasında yankılama, montaj noktasındaki tüm boş alanı yanlışlıkla doldurmaktan korumaktır. Komut dosyasını unutursam veya saatte GB veri verirse, bu basit hata ayıklama görevi potansiyel bir sistem çökmesine neden olabilir.

Şimdi, bazı araçlarda (tcpdump içinde -W / -C kombinasyonu gibi) oluşturulan seçeneklerin farkındayım. İhtiyacım olan çok genel bir arıza güvenliği.

Uzun lafın kısası - şöyle bir senaryo çalıştırdığımda:

% this -is --my=very|awsome|script >> /var/tmp/output.log

Output.log dosyasının asla 1GB'den daha büyük olmayacağından nasıl emin olabilirsiniz?

Senaryo çökebilir, öldürülebilir ya da her neyse.

Aradığım çözüm sadece ubuntu / debian / fedora gibi popüler dağıtımlarda bulunan araçları kullanarak kolay ve basit olmalıdır. Genel olarak yaygın olarak bulunan bir şey. Karmaşık, çok satırlı program, dil / teknolojiden bağımsız olarak burada bir seçenek değildir.

Yanıtlar:


16

Bunun için kullanabilirsiniz head:

command | head -c 1G > /var/tmp/output.log

K, M, G ve benzerlerini sonek olarak kabul eder (bayt varsayılan değerdir). Temel 10 sürümlerini kullanmak için 'B' ekleyin.


baş agains duvar Daha basit olamazdı. Teşekkürler!
mdrozdziel

2
Ayrıca tail -c 1Gbir olayın kuyruğuna bakmak için de işe yarıyor. Anlaşılır bir şekilde komut bittikten sonra yıkanır.
dashesy

Son ekler birimi Mac OS'de çalışmaz.
anumi

0

Yalnızca bu komut dosyalarını çalıştırmak için kullanılacak bir kullanıcı için maksimum dosya boyutunu ayarlayın.

Belirli /etc/security/limitsbir kullanıcı için açık değerler olmadığı sürece, dosya bir kullanıcıyı "varsayılan" değerleriyle sınırlar. Bu kullanıcıya özgü değerler, varsayılan değerlerin üzerine yazılır. Dosya, işletim sisteminize bağlı olarak biraz farklı bir ada sahip olabilir.

Günlük kullanıcınızın adı log_maker ise, bu satırı dosyaya ekleyin:

log_maker hard fsize 1000000

Fsize'den sonraki sayı, KB cinsinden maksimum dosya boyutudur.


0

curtail, bir programın çıktısının boyutunu sınırlar ve aşağıdaki komutla son X KB çıktıyı korur:

çalışma_programı | curtail -s 1G Instagram Hesabındaki Resim ve Videoları myprogram.log

https://github.com/Comcast/Infinite-File-Curtailer

NOT: Ben yukarıdaki repoyu koruyucusuyum. Sadece çözümü paylaşıyorum ...


0

İle herhangi bir dosyayı sınırlayabilirsiniz

tail -c 1G myLog.log > myLog.tmp
mv myLog.tmp > myLog.log

Kuyruğu doğrudan aynı dosyaya yazmak boş bir dosya oluşturur. Bu nedenle geçici bir dosya kullanmanız gerekir.


tail -c 1G myLog.log> myLog.tmp mv myLog.tmp> myLog.log bu günlüğü öldürür, sanırım> yerine >> kullanmak ister misin?
djdomi

Bu komutun amacı, günlüğü yalnızca son 1G ile yeniden yazmaktır. >> bir önceki komut için olmalıdır: doSomething >> myLog.log; kuyruk -c 1G myLog.log> myLog.tmp; mv myLog.tmp> myLog.log;
Séverin
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.