Onde devo colocar meu cache de aplicativos para aplicativos baseados em Unix?

9

Estou criando um aplicativo de linha de comando e preciso salvar alguns dados temporários em arquivos. Eu não sei onde é a convenção para aplicativos para armazenar seu cache em sistemas baseados em unix (neste caso, o Ubuntu 12.0.4)?

    
por Dolphin 14.09.2012 / 16:31

1 resposta

11

"Sistemas baseados em Unix" é uma categoria muito geral para fazer qualquer tipo de determinação aplicável em geral que será aplicada a sistemas baseados em Unix all . O problema é que a estrutura do sistema de arquivos (e o local "adequado" / "convencional" para colocar as coisas) é tão diferente entre diferentes sabores do "Unix" (se você pode chamá-lo assim) que você tem que lidar com isso caso a caso.

Alguns exemplos:

  • No Ubuntu, as bibliotecas de 64 bits entram em / usr / lib ou / usr / lib / x86_64-linux / e as bibliotecas de 32 bits entram em / usr / lib32
  • No Fedora, as bibliotecas de 64 bits entram em / usr / lib64 e as bibliotecas de 32 bits entram em / usr / lib
  • O Fedora não tem mais noção de / lib ou / bin (eles são apenas links simbólicos para os diretórios / usr equivalentes)
  • A maioria das distribuições Linux preferem instalar software instalado pelo usuário (ou seja, software não fornecido pelo gerenciador de pacotes) em / usr / local / (com lib, bin, etc, var e dentro de / usr / local /)
  • Muitas distribuições Linux usam / var / cache para cache, embora se for "transitório" (não importa se é perdido), ele pode ser armazenado em / tmp
  • Alguns aplicativos do tipo "aplicativo em uma pasta" armazenam tudo em um subdiretório de / opt (especialmente instaladores de clickwrap)
  • Alguns aplicativos são instalados em um subdiretório do diretório ~ do usuário (geralmente / home / username)
  • No Solaris, vi / srv usado de forma semelhante a / opt, ou às vezes / srv é o www-root

A resposta é que a convenção canônica, socialmente aceitável, bem integrada para onde armazenar qualquer coisa em qualquer sistema operacional, seja uma distribuição do Linux, BSD, Solaris, HP-UX, etc. depende das circunstâncias exatas . Especificamente:

  • Como o pacote é distribuído?
  • O usuário requer acesso root para instalá-lo?
  • O pacote depende ou se integra diretamente com outros pacotes que já estão no sistema, por exemplo, um plugin ou add-on?
  • O pacote será integrado aos repositórios upstream da distribuição, para que os usuários possam usar um comando como apt-get ou yum para instalá-lo diretamente sem baixar um instalador de um site?
  • O software terá configuração separada para cada usuário diferente que opera o computador?
  • O software terá configurações globais que só devem ser modificadas pelo administrador (root)?
  • O software precisa integrar-se ao sistema init (por exemplo, para iniciar na inicialização)?

Não há resposta direta para isso sem considerar todos os fatores. No entanto, para o Ubuntu 12.04 especificamente , se você estiver compilando o pacote em um arquivo .deb para ser distribuído em um PPA ou para enviar para os repositórios de pacotes do próprio Ubuntu ( main ou universe ), Eu recomendaria que o cache fosse armazenado em /var/cache . Mas isso é apenas para o Ubuntu e você certamente não deve aplicar a suposição de que cada distribuição ou sistema operacional baseado em Unix considerará isso aceitável.

Além disso, se não houver vantagens em salvar os dados do cache nas inicializações do sistema, acho que também poderia pertencer a / tmp.

Observe que você vai encontrar esses problemas de convenção de caminhos para todo tipo de arquivo que seu programa usa: dados compartilhados, arquivos executáveis, bibliotecas, arquivos de ajuda, imagens, som, páginas da web, e assim por diante. Então eu tenho que saber, se você está perguntando sobre arquivos de cache, como você está planejando para lidar com os outros tipos de arquivo. Você está apenas fazendo suposições ingênuas e esperando que ninguém discorde de você? Se você não leu nenhum documento ou padrão do Ubuntu sugerindo onde colocá-los, é uma má ideia simplesmente assumir uma coisa ou outra. Por exemplo, sempre colocar as bibliotecas em / usr / lib pode ser um erro, pois dependendo da situação elas podem pertencer a outro lugar.

Além disso, como desenvolvedor de software, acho que a coisa mais responsável a fazer é permitir que o usuário final decida onde colocar seus arquivos. Você pode definir padrões, mas os usuários (e distribuidores) podem e irão personalizar a construção para se adequar à sua distribuição.

A maneira mais fácil de fazer isso é construir seu programa usando o GNU Autoconf . Autoconf é um sistema de compilação no qual o usuário pode passar argumentos de linha de comando para o script de compilação para alterar os caminhos dos vários "tipos de diretório" para longe dos padrões. Quase toda distribuição tem um script de construção para cada pacote Autoconf que define os diretórios convencionais apropriados para cada tipo. Eles até têm especificamente um tipo de diretório para cache: sharedstatedir .

    
por 14.09.2012 / 16:48

Tags