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 > file
hedefi doğru bir şekilde başarmakla birlikte, sert bir şehir efsanesine rağmen, cat /dev/null
kı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/null
olduğ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/null
kodda çok kötü tutuldu.
Yani Aşağıdaki kod tüm ortak kabukları (hem çalışmak anlamına gelir csh
ve sh
aileleri):
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
, zsh
beğ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/null
daha 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 wtmp
sabit genişlikli kayıtları saklamak gibi günlük dosyaları kıracak .
echo > file
echo "" > file
Bir BSD sh
seç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 sh
kaçış 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: