Gdzie mam umieścić pamięć podręczną aplikacji dla aplikacji opartych na Uniksie?

10

Buduję aplikację wiersza polecenia i muszę zapisać niektóre dane tymczasowe w plikach. Nie wiem, gdzie jest konwencja dla aplikacji do przechowywania pamięci podręcznej w systemach uniksowych (w tym przypadku Ubuntu 12.0.4)?

Delfin
źródło

Odpowiedzi:

12

„Systemy oparte na Uniksie” są zdecydowanie zbyt ogólną kategorią, aby dokonywać wszelkiego rodzaju ogólnych ustaleń, które będą miały zastosowanie do wszystkich systemów opartych na Uniksie. Problem polega na tym, że struktura systemu plików (i „właściwe” / „konwencjonalne” miejsce do umieszczania rzeczy) jest tak bardzo różna w różnych smakach „Uniksa” (jeśli można to tak nazwać), że prawie trzeba sobie z tym poradzić indywidualnie dla każdego przypadku.

Kilka przykładów:

  • W systemie Ubuntu biblioteki 64-bitowe przechodzą do / usr / lib lub / usr / lib / x86_64-linux /, a biblioteki 32-bitowe przechodzą do / usr / lib32
  • W Fedorze 64-bitowe biblioteki przechodzą do / usr / lib64, a 32-bitowe biblioteki przechodzą do / usr / lib
  • Fedora nie ma już pojęcia / lib lub / bin (są to tylko dowiązania symboliczne do równoważnych katalogów / usr)
  • Większość dystrybucji Linuksa woli instalować oprogramowanie zainstalowane przez użytkownika (tzn. Oprogramowanie nie dostarczone przez menedżera pakietów) w / usr / local / (z lib, bin itp., Var, itd. W / usr / local /)
  • Wiele dystrybucji Linuksa używa pamięci podręcznej / var / cache, chociaż jeśli jest „przejściowa” (nie ma znaczenia, jeśli się zgubi), można ją zapisać w / tmp
  • Niektóre aplikacje typu „aplikacja w folderze” przechowują wszystko w podkatalogu / opt (szczególnie instalatory clickwrap)
  • Niektóre aplikacje po prostu instalują się w podkatalogu katalogu ~ użytkownika (zwykle / home / nazwa użytkownika)
  • Na Solarisie widziałem / srv używane podobnie do / opt, lub czasami / srv to www-root

Odpowiedź jest taka, że kanoniczna, społecznie akceptowana, dobrze zintegrowana konwencja o tym, gdzie przechowywać cokolwiek w dowolnym systemie operacyjnym, niezależnie od tego, czy jest to dystrybucja Linuksa, BSD, Solaris, HP-UX itp., Zależy od dokładnych okoliczności . Konkretnie:

  • Jak dystrybuowany jest pakiet?
  • Czy użytkownik wymaga dostępu do konta root, aby go zainstalować?
  • Czy pakiet zależy lub integruje się bezpośrednio z innymi pakietami już w systemie, np. Wtyczką lub dodatkiem?
  • Czy pakiet zostanie zintegrowany z wcześniejszymi repozytoriami dystrybucji, aby użytkownicy mogli użyć polecenia podobnego apt-getlub yumzainstalować go bezpośrednio, bez pobierania instalatora ze strony internetowej?
  • Czy oprogramowanie będzie miało osobną konfigurację dla każdego użytkownika obsługującego komputer?
  • Czy oprogramowanie będzie miało globalne ustawienia konfiguracji, które powinien modyfikować tylko administrator (root)?
  • Czy oprogramowanie musi zostać zintegrowane z systemem init (np. Aby uruchomić przy starcie systemu)?

Nie ma prostej odpowiedzi na to pytanie bez uwzględnienia wszystkich czynników. Jednak szczególnie w przypadku Ubuntu 12.04 , jeśli budujesz swój pakiet w .debpliku, który ma być dystrybuowany w PPA lub do przesyłania do własnych repozytoriów pakietów Ubuntu ( mainlub universe), zalecam przechowywanie pamięci podręcznej /var/cache. Ale dotyczy to tylko Ubuntu i na pewno nie powinieneś przyjmować założenia, że ​​każda dystrybucja lub system operacyjny oparty na Uniksie uzna to za dopuszczalne.

Ponadto, jeśli nie ma żadnych korzyści z zapisywania danych w pamięci podręcznej między systemami, myślę, że może to również należeć do / tmp.

Pamiętaj, że napotkasz problemy z konwencją ścieżkowania dla każdego typu pliku, z którego korzysta Twój program: współdzielone dane, pliki wykonywalne, biblioteki, pliki pomocy, obrazy, dźwięk, strony internetowe i tak dalej. Więc muszę się zastanawiać, jeśli pytasz o pliki pamięci podręcznej, w jaki sposób planujesz obsługiwać inne typy plików. Czy po prostu przyjmujesz naiwne założenia i masz nadzieję, że nikt się z tobą nie zgadza? Jeśli nie przeczytałeś żadnych dokumentów lub standardów Ubuntu sugerujących, gdzie je umieścić, złym pomysłem jest po prostu założenie takiej czy innej rzeczy. Na przykład zawsze trzymanie bibliotek w / usr / lib może być pomyłką, ponieważ w zależności od sytuacji mogą one należeć gdzie indziej.

Ponadto jako programista uważam, że najbardziej odpowiedzialną rzeczą jest umożliwienie użytkownikowi końcowemu decydowania, gdzie umieścić swoje pliki. Możesz ustawić wartości domyślne, ale użytkownicy (i dystrybutorzy) mogą i dostosują kompilację do swoich dystrybucji.

Najprostszym sposobem na to jest zbudowanie programu za pomocą GNU Autoconf . Autoconf to system kompilacji, w którym użytkownik może przekazywać argumenty wiersza polecenia do skryptu kompilacji, aby zmienić ścieżki różnych „typów katalogów” od domyślnych. Prawie każda dystrybucja ma skrypt kompilacji dla każdego pakietu Autoconf, który ustawia odpowiednie dla danej dystrybucji konwencjonalne katalogi dla każdego typu. Mają nawet konkretny typ katalogu pamięci podręcznej: sharedstatedir .

allquixotic
źródło
Po pierwsze bardzo dziękuję za odpowiedź, bardzo szczegółową. Charakter aplikacji (ruby) polega na buforowaniu wywołań API obsługujących zawartość statyczną. To jest aplikacja ruby, a z tego, co przeczytałem w twoim miejscu odpowiedzi, moja pamięć podręczna dysku byłaby /tmpfolderem. Odpowiedzi na twoje pytania brzmiałyby (pobierz, nie, nie, nie, nie, nie, nie). Prawdopodobnie wydaje się normalne, że większość ludzi doszła do wniosku, /tmpże jestem nowy w systemach uniksowych, a konwencje oparte na Ubuntu os są mi nieznane. Otwiera to ciekawy pomysł na gem, aby umożliwić buforowanie dysku agnostycznego (agnostic użytkownika). Dzięki, +1 ode mnie.
Dolphin
Zauważ, że system klejnotów rubinowych zainstalowany w większości dystrybucji Linuksa ma bardzo specyficzny katalog, w którym klejnoty są instalowane przez gemnarzędzie. Jednak prawdopodobnie nie byłoby właściwe tworzenie plików w czasie wykonywania w tym samym katalogu, w którym aplikacja jest pobierana przez klejnot. Z drugiej strony, jeśli korzystasz z aplikacji jako użytkownik, potrzebujesz katalogu, który jest przeznaczony do odczytu i zapisu dla użytkowników , a to oznacza albo zmianę uprawnień (co wymaga jeszcze większej pracy integracyjnej systemu w czasie instalacji, takiej jak utworzenie grupy itp.) lub za pomocą globalnego katalogu do odczytu i zapisu, np. / tmp.
allquixotic
Nie można i nie należy zapisywać dane do /usr, /liblub /binz aplikacji.
ctrl-alt-delor