Adlandırılmış bir kanal getirisi üzerindeki seek () işlemlerini başarılı yapmak mümkün müdür?


12

Programların seek()adlandırılmış bir kanalda işlem gerçekleştirmeye çalıştığında 'Yasadışı arama' yerine başarılı bir şekilde geri dönecek (ancak boru boş bir dosya gibi davranacak) şekilde yapmanın herhangi bir yolu var mı ?

Bir SQLite veritabanında saklanan sistemimdeki her son küçük günlük kaydım var, hiçbir yerde dosyam yok. Ancak bununla ilgili sorun yaşayan birkaç program vardır. 2 özel durum vardır;

  • Bir program, sistem günlüğünün adlandırılmış yöneltme olarak oluşturduğu ve okuduğu bir günlük dosyasına yazmak ister. Program bir seek()nedenden dolayı bir performans göstermek istiyor ve başarısız oluyor.
  • Bir program (denyhosts veya fail2ban gibi), sistem günlüğünün adlandırılmış yöneltme olarak oluşturduğu ve yazdığı bir günlük dosyasından okumak ister. Program seek()üzerinde bir performans sergilemek istiyor ve başarısız oluyor.

İdeal olarak, bu adlandırılmış boru sadece boş bir dosya gibi davranmak istiyor. Bir günlük yazan bir programın yine de bir arama yapmak için neden olması için herhangi bir neden göremiyorum, sadece dosya eklemek ve yazmaya başlamak için dosyayı açması gerekir. Bir program okumasının neden aramak isteyeceğini anlayabiliyorum, böylece son konumundan devam edebilir ve böylece dosyanın boşmuş gibi davranmasını istiyorum (kesilmiş gibi).

Peki, bu şekilde davranmalarını sağlamak için adlandırılmış kanallara ayarlanabilecek bir seçenek var mı? Değilse, syslog-ng bu şekilde davranması için boruyu açtığında ayarlanabilecek bir mod var mı (kod değişiklikleri yapmaya açıkım)? Yoksa ben bir dere mi?

Yanıtlar:


10

Linux çekirdeği için aranabilir borular önerildi, ancak bunları uygulamak için çalışan bir yamanın farkında değilim.

Belirli dosyalarda çağrıyı LD_PRELOADgeçersiz kılan bir 'ed kitaplığı kullanabilirsiniz lseek. Bu amaçla herhangi bir hazır ambalaj bilmiyorum. Gölgeler bir tane yazmaya yardımcı olabilir.


1
LD_PRELOAD rotasını deneyeceğim. En büyük çözüm değil, ancak yapılabilir olmalıdır.
Patrick

Btw, boruyu dosya takip ettiği gibi takip edebilmek için daha az aranabilir boruya sahip olmak gerekli midir? Ben daha az kullanarak bir boru izleyin bağlamında soruyorum ? soru (orada cevap vermeyi tercih edebilirsiniz).
Piotr Dobrogost

@PiotrDobrogost FKomut bağlamında daha az sürede, bir saniye kadar herhangi bir çıktı almazsa ekranı yenilemek daha az yeterli olacaktır. Boruları aranabilir yapmak yardımcı olmaz: ilgili fark F, dosyanın sonuna gider, daha sonra verilerin sonuna kadar görünmesini bekler - ancak bir boru için, dosyanın sonu yalnızca yazar dosyayı kapattığında gelir.
Gilles 'SO- kötü olmayı bırak'

1

Uygulama arama çağırıyorsa, ya kırık ya da borular üzerinde çalışmak için değildir. Eğer eski ise, o zaman düzeltilmesi gerekiyor. Eğer ikincisi, o zaman gerçekten çalışma arayışını bekler, bu yüzden yalan söylememek ve işe yaramadığını iddia etmek neredeyse kesinlikle yanlış çalışmaya neden olacaktır.

Ayrıca günlük dosyası adlandırılmış bir kanalla değiştirilirse, aynı anda yalnızca bir işlem okunabilir. Bunun yerine bir soket olmalıdır.


2
Borularda çalışmak anlamına gelmez, borular üzerinde çalışamazsınız. Uygulama dosyanın sonuna ulaşmak için sadece SEEK_END yapıyorsa ne olur? Veya geçerli konumu bulmak için bir SEEK_CUR yapıyor olabilir. Aramanın sonuçları hakkında programa yalan söylersem bunların hiçbiri sorun yaratmaz. Kırılacak tek yer, uygulamanın geri dönüp günlük dosyaları ile yapmaması gereken önceden yazılmış verilerin üzerine yazmaya çalışmasıdır. Ve evet, boru başına bir işlem sınırlamasının farkındayım. Bu bir sorun olmayacak.
Patrick

1
Tek yaptığı şey sonuna eklemek istiyorsa, dosyayı sadece ekleme modunda açması gerekir, bu yüzden kırık kategoriye girer. Uygulamalar, başka bir yerde arama yapmaları gerekip geçerli konuma geri dönmeleri gerekmedikçe geçerli konumu bulmaya çalışmazlar, bu nedenle "sessizce başarısızlıkla kırarsınız" kategorisine girer. Bir programın arama yapması çok olası değildir, ancak gerçekten çalışması gerekmez (ve eğer yaparsa, kırık kategoriye girer).
psusi

1
Doğru değil. Birçok uygulama, son programdan bu yana başka bir programın dosyaya yazmış olması durumunda dosyanın sonuna bakar. Aksi takdirde, şu anda bulunduğu yerde yazmak diğer programın değişikliklerini tıkayacaktır. Ve dosyadan okuması halinde, programın yeniden başlamasıyla kaldığı yerden devam edebilmesi için geçerli konumunu almak için SEEK_CUR kullanmak isteyebilirsiniz.
Patrick

1
@Patrick, birincisi için, eğer ekleniyorsa, dosyayı ekleme modunda yeniden açıyor olmalıdır. Bu durumda okuma hakkında konuşuyorsunuz, bu durumda henüz okumadığı yeni verileri atlamak mantıklı değildir (ve sessizce yok saymak bunu kırırdı). İkincisine gelince, kullanmaya çalışıyorsa, aramayı sessizce göz ardı ederseniz, bir boru üzerinde kırılacak dosyayı kapatıp yeniden açtıktan sonra aynı konuma dönmeye çalışın, çünkü boruyu kapattığında sunucu bir SIGPIPE alır. muhtemelen boruyu açan bir sonraki istemci başlangıçta başlayacak şekilde sıfırlar.
psusi
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.