Onde devo colocar o cache do meu aplicativo para aplicativos baseados em Unix?

10

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

Golfinho
fonte

Respostas:

12

"Sistemas baseados em Unix" é uma categoria muito geral para fazer qualquer tipo de determinação geralmente aplicável que se aplicará a todos os sistemas baseados em Unix. O problema é que a estrutura do sistema de arquivos (e o local "adequado" / "convencional" para colocar as coisas) é tão diferente entre os diferentes tipos de "Unix" (se é que você pode chamar assim) que você praticamente precisa lidar com isso caso a caso.

Alguns exemplos:

  • No Ubuntu, as bibliotecas de 64 bits acessam / usr / lib ou / usr / lib / x86_64-linux / e as bibliotecas de 32 bits acessam / usr / lib32
  • No Fedora, as bibliotecas de 64 bits acessam / usr / lib64 e as bibliotecas de 32 bits acessam / 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 equivalentes / usr)
  • A maioria das distribuições Linux prefere 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 assim por diante em / usr / local /)
  • Muitas distribuições Linux usam / var / cache para cache, embora seja "transitório" (não importa se se perde), 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 apenas em um subdiretório do diretório ~ do usuário (geralmente / home / nome de usuário)
  • No Solaris, eu já vi / srv usado de maneira semelhante a / opt, ou às vezes / srv é o www-root

A resposta é que a convenção canônica, socialmente aceitável e bem integrada de 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 a outros pacotes já existentes no sistema, por exemplo, um plug-in ou complemento?
  • O pacote será integrado aos repositórios upstream da distribuição, para que os usuários possam usar um comando como apt-getou yuminstalá-lo diretamente sem baixar um instalador de um site?
  • O software terá uma configuração separada para cada usuário diferente que opera o computador?
  • O software terá definições de configuração global que só podem ser modificadas pelo administrador (raiz)?
  • O software precisa se integrar ao sistema init (por exemplo, para iniciar na inicialização)?

Não há uma resposta direta para isso sem considerar todos os fatores. No entanto, para o Ubuntu 12.04 especificamente , se você estiver construindo seu pacote em um .debarquivo a ser distribuído em um PPA ou enviando para os repositórios de pacotes do Ubuntu ( mainou universe), eu recomendaria que o cache fosse armazenado /var/cache. Mas isso é apenas para o Ubuntu e você certamente não deve aplicar a suposição de que toda distro 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 eles também poderiam pertencer a / tmp.

Observe que você encontrará esses problemas de convenções de caminhos para cada 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, tenho que me perguntar, se você está perguntando sobre arquivos de cache, como planeja lidar com os outros tipos de arquivos. 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á-lo, é uma má idéia apenas assumir uma coisa ou outra. Por exemplo, sempre colar bibliotecas em / usr / lib pode ser um erro, pois depende da situação em que elas possam 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 personalizarão a construção para se adequar à sua distribuição.

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

allquixotic
fonte
Primeiro, muito obrigado pela sua resposta, muito detalhada. A natureza do aplicativo (ruby) é armazenar em cache chamadas de API que atendem a conteúdo estático. Este é um aplicativo ruby ​​e, pelo que li no seu local de resposta para o cache do meu disco, seria uma /tmppasta. As respostas para suas perguntas seriam (download, não, não, não, não, não, não). Provavelmente parece normal para a maioria das pessoas concluir que é, /tmpmas eu sou novo em sistemas unix e as convenções baseadas em ubuntu não são familiares para mim. Isso abre uma idéia interessante para gem permitir cache de disco independente (independente do usuário). Obrigado, +1 de mim.
Dolphin
Observe que o sistema ruby ​​gem instalado na maioria das distribuições Linux possui um diretório muito específico onde as gemas são instaladas pela gemferramenta. No entanto, provavelmente não seria apropriado criar arquivos em tempo de execução no mesmo diretório em que o aplicativo é baixado pela gem. Por outro lado, se você estiver executando o aplicativo como usuário, precisará de um diretório de leitura e gravação para os usuários , o que significa alterar as permissões (o que exige ainda mais integração do sistema no momento da instalação, como a criação de um grupo etc) ou usando um diretório global de leitura e gravação, por exemplo, / tmp.
allquixotic
Você não pode, e não deve gravar dados /usr, /libou /bina partir da aplicação.
Ctrl-alt-delor