Neden birşeye / dev / null'a katılıyorsun?
Bunu, inode'u sağlam tutarken bir dosya içeriğini kesmek için yapacaksınız. Bu dosyayı okumak veya yazmak için açık olan tüm programlar, dosya boyutunun sıfıra ayarlanması gerçeğinin dışında etkilenmez.
Sık rastlanan sahte bir alternatif, dosyayı kaldırdıktan sonra yeniden oluşturmaktır:
rm file
touch file
veya benzerleri:
mv file file.old
gzip file.old
touch file
Mesele şu ki, bu yöntemler eski dosyanın silinen dosyayı silme işlemi sırasında açtıkları işlemler ile yazılmasının engellenmemesidir. Unix dosya sistemlerinin altında olmasının nedeni, bir dosyayı sildiğinizde, yalnızca adını (yolunu) içeriğinden (inode) ayırırsınız. Inode okuma veya yazma için açık olan süreçler olduğu sürece canlı tutulur.
Bu, birkaç olumsuz etkiye neden olur: Silinen bir dosyayı açmak için basit / taşınabilir bir yol olmadığından, dosya silindikten sonra yazılan günlükler kaybolur. Bir işlem silinen dosyaya yazdığı sürece, içeriği hala dosya sistemindeki alanı kullanıyordur. Bu, diski doldurduğu için dosyayı kaldırır / oluşturursanız, diskin dolu kaldığı anlamına gelir. Bu ikinci sorunu çözmenin bir yolu, günlük işlemlerini yeniden başlatmaktır, ancak kritik hizmetler ve aracı günlükler için kesin olarak kaybolacaklarını yapmak istemeyebilirsiniz. Ayrıca, oluşturduğunuz dosyanın orijinalinden aynı izinlere, mal sahibine ve gruba sahip olmama nedeniyle de yan etkileri olabilir. Bu, örneğin bir günlük analizcisinin yeni oluşturulan dosyayı okumasını veya daha da kötüsü, günlük işleminin kendi günlüklerini yazmasını engelleyebilir.
İlk yöntem, cat /dev/null > filehedefi doğru bir şekilde başarmakla birlikte, sert bir şehir efsanesine rağmen, cat /dev/nullkısmı kesinlikle hiçbir işe yaramaz. Tasarım gereği boş olan bir sahte dosyayı açar, ondan hiçbir şey okuyamaz ve sonunda çıkar. Bu komutun kullanılması, tuş vuruşlarının, baytların, sistem çağrılarının ve CPU döngülerinin israfıdır ve hiç şüphesiz daha hızlı no-op komutuyla herhangi bir işlevsel değişiklik yapılmadan :veya hatta çoğu kabukla hiçbir komut olmadan değiştirilebilir.
Ne kadar işe yaramaz cat /dev/nullolduğunu açıklamak için bir metafor deneyeyim . Diyelim ki amacınız bir bardak boşaltmak.
Önce ondan herhangi bir sıvıyı çıkartın. Bu yeterlidir ve tam olarak ne ( > file) yaptığı, yönlendirmelerin her zaman önce işlendiği gerçeğini verir.
Sonra, boş bir şişeyi ( /dev/null) seçip boş bardağa ( cat) dökün . Bu anlamsız adım ...
Bağlantılı belgenizi sonuna kadar okursanız , komut satırının gelişmiş sürümünden bu satırdaki yorumları görebilirsiniz:
cat / dev / null> wtmp # ':> wtmp' ve '> wtmp' aynı etkiye sahiptir.
Gerçekten de; cat /dev/nullkodda çok kötü tutuldu.
Yani Aşağıdaki kod tüm ortak kabukları (hem çalışmak anlamına gelir cshve shaileleri):
cd /var/log
: > messages
: > wtmp
echo "Log files cleaned up."
ve bunun gibi Bourne sözdizimi kullanarak tüm kabukları ile çalışacaktır ash, bash, ksh, zshbeğeni ve:
cd /var/log
> messages
> wtmp
echo "Log files cleaned up."
Bununla birlikte, eski POSIX öncesi Bourne mermilerinde, bu komutlardan herhangi birinin, cat /dev/nulldaha sonra kendisine eklenmiş hala çalışan bir kabuk betiği tarafından yazıldığı takdirde, bir dosyayı kısaltmayacağını unutmayın. Sıfır bayt bir dosya yerine, boyutu değişmeden seyrek bir dosya olacaktır. Aynı şey, eğer dosya yazmadan önceki geçerli olduğunu düşündüğü pozisyonu arayan bir süreçle yazılırsa olur.
Ayrıca, bir dosyayı kısaltmak için önerilen bazı alternatif çözümlerin kusurları olduğunu unutmayın.
Aşağıdakilerden ikisi de sadece işi yapmıyor. Ortaya çıkan dosya boş değil, boş bir satır içeriyor. Bu wtmpsabit genişlikli kayıtları saklamak gibi günlük dosyaları kıracak .
echo > file
echo "" > file
Bir BSD shseçeneğine dayanan bir sonraki taşınabilir değildir, POSIX yankı için izin verilen herhangi bir seçenek belirtmez, bu nedenle " -n" ile bir satır içeren bir dosyaya sahip olabilirsiniz :
echo -n > file
Bu da bir System V shkaçış dizisi kullanarak taşınabilir değildir . Bazı kabuklar " \c" ile bir satır içeren bir dosya oluşturacaktır :
echo "\c" > file
Bu işi yapmak için tasarlanmış bir komutu kullanıyor. Sorun kullanılamıyor truncateçünkü POSIX tarafından belirtilmeyen bu komut bir Unix / Linux sisteminden eksik olabilir.
truncate -s 0
Son olarak, burada taşınabilir olan ve işi düzgün şekilde yapacak birkaç alternatif var: