Unix tabanlı uygulamalar için uygulama önbelleğimi nereye koymalıyım?


10

Komut satırı uygulaması oluşturuyorum ve bazı geçici verileri dosyalara kaydetmem gerekiyor. Uygulamaların önbelleklerini unix tabanlı sistemlerde (bu durumda Ubuntu 12.0.4) saklamak için kuralın nerede olduğunu bilmiyorum?

Yanıtlar:


12

"Unix tabanlı sistemler", tüm Unix tabanlı sistemlere uygulanacak her türlü genel olarak uygulanabilir belirleme yapmak için çok genel bir kategoridir . Sorun dosya sistemi yapısı (ve bir şeyler koymak için "uygun" / "geleneksel" yer) "Unix" farklı lezzetleri arasında o kadar çılgınca farklı (eğer bunu bile diyebilirseniz) onu işlemek zorunda duruma göre.

Birkaç örnek:

  • Ubuntu'da 64 bit kitaplıklar / usr / lib veya / usr / lib / x86_64-linux / ve 32 bit kitaplıklar / usr / lib32
  • Fedora'da 64 bit kitaplıklar / usr / lib64'e ve 32 bit kitaplıklar / usr / lib'e gider
  • Fedora artık / lib veya / bin kavramına sahip değil (sadece eşdeğer / usr dizinlerine sembolik bağlar oluşturuyorlar)
  • Linux dağıtımlarının çoğu / usr / local / dizinine (usr / local / dizinine) kullanıcı tarafından yüklenen yazılımı (paket yöneticisi tarafından sağlanmayan yazılım) yüklemeyi tercih eder.
  • Birçok Linux dağıtımı önbellek için / var / cache kullanır, ancak "geçici" ise (kaybolup kaybolmadığı önemli değil), / tmp içinde saklanabilir
  • Bazı "klasördeki uygulama" türü uygulamalar her şeyi / opt alt dizininde saklar (özellikle clickwrap yükleyicileri)
  • Bazı uygulamalar kullanıcının ~ dizininin alt dizinine yüklenir (genellikle / home / username)
  • Solaris'te / srv komutunun / opt komutuna benzer şekilde kullanıldığını veya bazen / srv komutunun www-root olduğunu gördüm

Yanıt, Linux, BSD, Solaris, HP-UX vb. Bir dağıtım olsun, herhangi bir işletim sisteminde herhangi bir şeyin nerede depolanacağı için kanonik, sosyal olarak kabul edilebilir, iyi entegre edilmiş sözleşmenin kesin koşullara bağlı olmasıdır . özellikle:

  • Paket nasıl dağıtılır?
  • Kullanıcı yüklemek için root erişimine ihtiyaç duyuyor mu?
  • Paket, sistemde bulunan diğer paketlere (ör. Bir eklenti veya eklenti) bağlı mı yoksa doğrudan entegre oluyor mu?
  • Paket, dağıtımın akış yukarı depolarına entegre edilecek mi, böylece kullanıcılar bir web sitesinden bir yükleyici indirmeden doğrudan bir komut kullanabilir apt-getveya yumkurabilirler mi?
  • Yazılım, bilgisayarı çalıştıran her farklı kullanıcı için ayrı yapılandırmaya sahip olacak mı?
  • Yazılımın yalnızca yönetici (kök) tarafından değiştirilebilmesi gereken genel yapılandırma ayarları olacak mı?
  • Yazılımın başlatma sistemi ile entegre olması gerekiyor mu (örn. Önyüklemeye başlamak için)?

Tüm faktörleri dikkate almadan bunun doğrudan bir cevabı yoktur. Ancak, Ubuntu 12.04 için özel olarak , paketinizi .debbir PPA'da dağıtılacak bir dosyaya kuruyorsanız veya Ubuntu'nun kendi paket depolarına ( mainveya universe) göndermek için önbelleğin depolanmasını tavsiye ederim /var/cache. Ancak bu sadece Ubuntu içindir ve her dağıtım veya Unix tabanlı işletim sisteminin bunu kabul edilebilir olarak kabul edeceği varsayımını kesinlikle uygulamamalısınız.

Ayrıca, önbellek verilerini sistemin önyüklemelerine kaydetmenin hiçbir avantajı yoksa, / tmp'ye ait olabileceğini düşünüyorum.

Programınızın kullandığı her dosya türü için bu yollama kuralı sorunlarıyla karşılaşacağınızı unutmayın: paylaşılan veriler, yürütülebilir dosyalar, kütüphaneler, yardım dosyaları, resimler, ses, web sayfaları ve açık. Önbellek dosyaları hakkında soruyorsanız, diğer dosya türlerini nasıl ele almayı planladığınızı merak etmeliyim. Sadece saf varsayımlar mı yapıyorsun ve kimsenin seninle aynı fikirde olmadığını umuyor musun? Nereye koyacağınızı öneren herhangi bir Ubuntu dokümanı veya standardı okumadıysanız, sadece bir şeyi varsaymak kötü bir fikirdir. Örneğin, kütüphaneleri her zaman / usr / lib içine yapıştırmak, başka bir yere ait olabilecek duruma bağlı olarak bir hata olabilir.

Ayrıca, bir yazılım geliştiricisi olarak, yapılacak en sorumlu şey, son kullanıcının dosyalarını nereye koyacağına karar vermesine izin vermek olduğunu düşünüyorum. Varsayılanları ayarlayabilirsiniz, ancak kullanıcılar (ve distribütörler) derlemeyi dağıtımlarına uyacak şekilde özelleştirebilir ve özelleştirecektir.

Bunu yapmanın en kolay yolu, programınızı GNU Autoconf kullanarak oluşturmaktır . Autoconf, kullanıcının çeşitli "dizin türlerinin" yollarını varsayılanlardan uzağa değiştirmek için komut satırı bağımsız değişkenlerini yapı komut dosyasına geçirebildiği bir yapı sistemidir. Hemen hemen her dağıtımda, her Autoconf paketi için, her tür için dağıtım için uygun geleneksel dizinleri ayarlayan bir oluşturma komut dosyası bulunur. Hatta özellikle önbellek için bir dizin türü var: sharedstatedir .


Öncelikle cevabınız için çok teşekkür ederim, gerçekten çok ayrıntılı. Uygulamanın doğası (ruby) statik içerik sunan API çağrılarını önbelleğe almaktır. Bu yakut uygulaması ve benim disk önbelleği için yanıt yerinde okuduklarımdan /tmpklasör olacaktır . Sorularınızın cevapları (indirme, hayır, hayır, hayır, hayır, hayır, hayır) olacaktır. Muhtemelen çoğu insanın karar vermesi normal görünüyor, /tmpancak unix sistemlerinde yeniyim ve ubuntu os tabanlı sözleşmeler bana tanıdık gelmiyor. Bu, taş için agnostik disk önbelleğe almayı (kullanıcı agnostik) izin vermek için ilginç bir fikir açar. Teşekkürler, benden +1.
Yunus

Çoğu Linux dağıtımında yüklü olan yakut mücevher sisteminin, mücevherlerin gemaraç tarafından yüklendiği çok özel bir dizine sahip olduğunu unutmayın . Ancak, uygulamanızın mücevher tarafından indirildiği aynı dizinde çalışma zamanında dosya oluşturmak muhtemelen uygun olmaz. Öte yandan, uygulamayı bir kullanıcı olarak çalıştırıyorsanız, kullanıcılar için okuma-yazma olan bir dizine ihtiyacınız vardır ve bu, izinleri değiştirmek anlamına gelir (yükleme zamanında bir grup oluşturmak gibi daha fazla sistem entegrasyonu çalışması gerektirir) vb.) veya genel bir okuma-yazma dizini kullanarak, örneğin / tmp.
allquixotic

Yapamazsınız ve veri yazma olmamalıdır /usr, /libya /binda uygulamadan.
ctrl-alt-delor
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.