Ls -s ne zaman “0” yazdırır?


13

Tabii ki, bir dosyanın boş olup olmadığını test etmenin standart yolu şudur test -s FILE, ancak müşterilerimizden biri böyle testler içeren bir komut dosyası almıştır:

RETVAL=`ls -s ./log/cr_trig.log | awk '{print $1}'`
if test $RETVAL -ne 0
then
    echo "Badness: Log not empty"
    exit 25
fi

tedarikçinin test ettikleri iki ortamda çalıştığı iddiaları ile. Söylemeye gerek yok, test ettiğim her iki yerde de başarısız oldu.

Merak ettim. Boş dosyalar ne zaman ls -syazdırılır 0?

Şimdiye kadar bulduğum bulgular:

  • Linux'ta GFS: 4
  • Linux'ta ext4: 0
  • Solaris'te ZFS: 1
  • Solaris'te UFS: 0
  • AIX üzerinde jfs: 0
  • HP-UX üzerinde VxFS: 0
  • HP-UX üzerinde HFS: 0
  • Mac OS X'te HFS: 0

Ağ bağlantılı dosya sistemlerini henüz incelemedim.

Soru: Diğerlerine senaryolarının yanlış olduğunu zarif bir şekilde nasıl açıklayabilirim ?

Bence, "doğru" sürüm:

if test ! -s ./log/cr_trig.log
then
    echo "Badness: Log not empty"
    exit 25
fi

5
Sadece onlara testlerini göster. Testlerinin taşınabilir olmadığını kanıtlayan sert verileriniz var, daha fazlasına ihtiyacınız var mı?
Mat

Bu sunucuda şu ana kadar gördüğüm en ilginç sorulardan biri. Çok kötü olan sadece bir puan harcayabilir.
ktf

@ktf Her zaman bir ödül verebilirsiniz.
Joe

Yanıtlar:


6

Çok ilginç bir bulgu. ls -sBir dosyanın boş olup olmadığını kontrol etmek için hiç kullanmamış olmama rağmen, 0boş dosyalar için de rapor verdiğini varsayırdım.

Sorunuza: Mat'ın önceden yorumladığı gibi, onlara test sonuçlarınızı gösterin. Sonuçları onlara açıklamak için ls -s, bayt cinsinden gerçek boyutu değil, dosya sistemindeki ayrılan blokların miktarını rapor ettiğini belirtin . Açıkçası bazı dosya sistemi uygulamaları, inode içinde sadece bir NULL işaretçisi saklamak yerine herhangi bir veri depolamak zorunda olmasalar bile blokları ayırır.

Bunun açıklaması performansla ilgili olabilir. Boş kalacak boş dosyalar oluşturmak normal işlem için bir istisnadır (gördüğüm en yaygın kullanım, bir dosyanın varlığının yazılımın belirli bir durumunu temsil ettiği durum dosyalarının oluşturulmasıdır).

Ancak normalde oluşturulan bir dosya yakında bazı veriler alacaktır, bu nedenle belirli bir FS'nin tasarımcıları dosya oluşturma üzerine hemen bir veri bloğu tahsis etmeyi kabul etmiş olabilir, bu nedenle ilk veri geldiğinde bu görev zaten yapılır.

İkinci neden, bir dosyanın geçmişte silinen verileri içermesi olabilir. Son veri bloğunu boşaltmak yerine, bu veri bloğunun aynı dosya tarafından tekrar kullanılmak üzere saklanması faydalı olabilir.

DÜZENLE:

Bir neden daha akla geldiği: Değerleri bulduk dosya sistemleri> 0 olan ZFS RAID + LVM + FS uygulanması ve GFS , bir küme dosya sistemi. Her ikisinin de, düğümlerde depolanmayan dosya bütünlüğünü korumak için meta verileri depolaması gerekebilir. ls -sBu meta veriler için ayrılan veri bloklarındaki sayımlar olabilir .


4

Diğer dosya sistemlerinin çoğunun (hepsi olmasa da) aksine, ZFS statik bir dizi dizisini önceden konumlandırmaz. ZFS'de boş bir dosya oluşturmak, daha sonra rapor edilen yeni bir veri bloğunu kullanır ls -s.

GFS'nin diğer sıfır olmayan sonuca yol açan senkronizasyon / kilit verilerini depolaması gerektiğinden şüpheleniyorum.


2

ls -s doğrudan dizin girişinde depolananları içermeyen dosya için ayrılan blok sayısını bildirir.

Çoğu durumda, blok sayısı bayt sayısının yuvarlatılmış bayt cinsinden blok boyutuna bölünmesiyle elde edilir.

Blok sayısı seyrek bir dosyadakinden daha az olabilir . Örneğin, çoğu dosya sisteminde, 0 bloğa yayılan 8192 baytlık bir dosya oluşturulur:

$ perl -e 'truncate STDOUT, 8192' >a
$ ls -l a
-rw-r--r-- 1 gilles gilles 8192 Nov  1 21:32 a
$ ls -s a
0 a

Tersine, dosya sistemi dosyalar için blokları önceden yeniden konumlandırırsa veya meta verileri depolamak için bloklar kullanırsa blok sayısı daha fazla olabilir. Zfs, sunduğu çok sayıda özellik ve büyük dosya sistemlerine yönelimi göz önüne alındığında, dosya boyutu ve blok sayısı arasında açık olmayan bir yazışma olduğuna şaşırmadım; Ayrıntıları bilmiyorum, ancak blok sayısı sadece dosyaların boyutuna değil, aynı zamanda geçmişine de bağlıdır (daha büyük bir dosyayı kısaltmanın bir sonucu ise boş bir dosyada birden fazla bloğa sahip olabilirsiniz).

Neden ls -syanlış olduğunu açıklamak için : dosyanın boyutunu saymaz, dosya sistemine bağlı bir miktardır. Bir dosyanın ilk başta boş olup olmadığını belirlemenin dolaylı bir yoludur, harici bir araç ( ls) ve biraz ayrıştırma gerektirir; bunun yerine, test -sayrıştırma gerektirmeyen ve istediklerini tam olarak yerine getirecek şekilde kullanmalıdırlar . Bunun ls -sbir dosyanın boş olup olmadığını test etmenin iyi bir yolu olduğunu düşünüyorlarsa, çalıştığını haklı çıkarmak için üzerlerinde olması gerekir.

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.