Çıktıyı bir dosyaya yönlendirmek dosyaya bir kilit uygular mı?


30

Eğer bir emrim varsa

$ ./script >> file.log

bu iki kez çağrılır, ilk görüşme sona ermeden önce yapılan ikinci arama ile ne olur?

İlk çağrı çıktı dosyasına özel bir kilitleniyor mu? Öyleyse, ikinci komut dosyası yazmaya çalışırken başarısız olur mu, yoksa kabuk çıktıyı kabul ediyor mu (komut dosyasının bitmesine izin veriyor) ve bir hata attı mı?

Yoksa günlük dosyası iki kez yazılır mı?


1
Dosyayı varsayılan olarak kilitleyen herhangi bir sistem bilmiyorum. Daha muhtemel olan, iki programın da yazdıklarını birleştirerek sona ermesi, çünkü her ikisi de ekleme modunda olacaktı. Sonuçlar tahmin edilemezdi. "Merhaba dünya" yerine "hweolrllod" alabilirsiniz.
jw013

Yanıtlar:


18

Kullandığınız yana >>, araçlar ekleme, hangi her örneğinden her çıktı satırının meydana geldiği sırayla eklenir.

Senaryonuz çıktı baskılar ise 1\nyoluyla 5\nher ve örnek İkisi arasında bir saniye gecikme ile 2.5 saniye başlatıldığında daha sonra bu alırsınız:

1
2
1
3
2
4
3
5
4
5

Sorunuzu cevaplamak için: Hayır.


23

Unix sistemleri ve büyükleri zorunlu kilitlerden kaçınır. Çekirdeğin bir dosyayı kullanıcı programları tarafından yapılan değişikliklere karşı kilitleyeceği, ancak yalnızca başka bir program tarafından yazılmış olması durumunda olmayan birkaç durum vardır. Bir program yazdığı için hiçbir unix sistemi bir dosyayı kilitlemez.

Komut dosyanızın eşzamanlı örneklerinin birbirlerinin ayak parmaklarına basmamalarını istiyorsanız, gibi açık bir kilitleme mekanizması kullanmanız gerekir .flock lockfile

Eklemek üzere bir dosya açtığınızda, bu >>, her programın her zaman dosyanın sonuna yazacağını garanti eder. Böylece çoklu örneklerin çıktısı asla birbirinin üzerine yazmaz ve sırayla yazarlarsa çıktıları yazılanlarla aynı sırada kalır.

Olabilecek en kötü şey, örneklerden birinin birkaç çıktı parçası yazması ve bir araya gelmelerini beklemesidir. Bir örnek tarafından üst üste yazar, diğer örnekler kendi yazılarını yazabilir. Örneğin, 1. örnek yazarsa foo, 2. örnek yazar hellove yalnızca 2. örnek yazarsa bar, dosya içerecektir foohellobar.

Bir writesistem , sistem çağrısı çağırdığında etkin bir şekilde dosyaya yazar . Bir çağrı writeatomiktir: her çağrı, writediğer programlar tarafından kesilmeyen bir bayt dizisi yazar. Tek bir aramanın ne kadar writeetkili bir şekilde yazacağı konusunda genellikle bir sınırlama vardır : daha büyük boyutlar için, yalnızca verilerin başlangıcı yazılır ve uygulama writetekrar çağırılmalıdır. Ayrıca, birçok program tamponlama gerçekleştirir: bir hafıza alanında veri toplarlar, sonra bu verileri bir yığın halinde yazarlar. Bazı programlar, çıktı arabelleğini tam bir satır veya diğer anlamlı bir ayrımdan sonra temizler. Bu tür programlarla, çok uzun olmadığı sürece tüm hatların kesintisiz olmasını bekleyebilirsiniz (birkaç kilobayta kadar; bu, işletim sistemine bağlıdır). Program anlamlı noktalarla aynı hizada değil, sadece tampon boyutuna bağlı olarak, bir durumda 4kB, sonra başka bir örnekte 4kB, sonra yine ilk durumda 4kB gibi bir şey görebilirsiniz.

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.