Em qual pasta devo gravar meus arquivos intermediários, como um desenvolvedor?


17

Estou começando a escrever alguns scripts bash para o meu projeto e eles precisam de alguns arquivos ou variáveis ​​intermediários para serem gravados.

Quero saber a quais pastas posso ter acesso quando alguém executa meu script? É uma prática comum de usar /tmp/? Ou devo usar outra coisa?

Respostas:


21

Acho o documento Padrão da Hierarquia do Sistema de Arquivos inestimável ao procurar esse material.

Existem algumas opções,

  • / tmp - arquivos temporários 'não permanentes'
  • / var / tmp - arquivos temporários 'permanentes'
  • / var / cache - arquivos de dados transitórios 'application'

Realmente depende do tipo de dados que você está armazenando.


é melhor usar o que o usuário / ambiente oferece e usar apenas / tmp etc. como substituto. (o que unix.stackexchange.com/a/79776/7784 disse)
Oluf Lorenzen

15

Se você precisar gravar alguns arquivos temporários que duram apenas enquanto o script ou aplicativo estiver em execução, use o diretório indicado pela TMPDIRvariável de ambiente ou se essa variável não estiver definida /tmp,.

/tmpé limpo no momento da inicialização em alguns sistemas (às vezes, é até na RAM, por exemplo, no Solaris e em algumas instalações do Linux), portanto não pode ser usado para arquivos que precisam sobreviver a uma falha de energia ou reinicialização. /var/tmppode ser usado para arquivos que precisam sobreviver a uma reinicialização, mas que podem ser limpos pelo administrador do sistema periodicamente. Se seu aplicativo precisar salvar arquivos permanentemente, escreva-os em algum lugar no diretório inicial do usuário (em ~/.programmingnoobsappou ~/.cache/programmingnoobsapp) ou em /var/lib/programmingnoobsappou /var/cache/programmingnoobsapp.

Observe que /tmpé compartilhado entre todos os usuários, portanto, é necessário tomar precauções ao criar um arquivo lá. Você precisa escolher um nome de arquivo que ainda não exista e ter cuidado para não permitir uma condição de corrida em que outro processo crie o arquivo à sua frente com permissões diferentes, o que poderia ser uma falha de segurança (se o outro processo estiver sendo executado como um usuário diferente, ele poderá acessar e modificar os dados do seu processo). Use o mktempcomando para criar um arquivo em /tmpou /var/tmp. Por padrão, mktempcria um arquivo $TMPDIRou, /tmpse TMPDIRnão estiver definido, geralmente é o lugar certo. Se você precisar usar vários arquivos temporários, ou mesmo se precisar de um único, recomendo a criação de um diretório para todos os seus arquivos temporários commktemp -d e removê-lo no final do seu script.

#!/bin/sh
tmp_root=
trap 'rm -rf "$tmp_root"' EXIT INT TERM HUP
tmp_root=$(mktemp -d)
tmpfile1=$tmp_root/file1
tmpfile2=$tmp_root/file2
…

wrt para mktemp, não removo arquivos temporários no final do meu script. Eu tenho um trabalho cron tmpwatch que remove automaticamente os arquivos antigos. Na grande maioria dos casos, não leio o arquivo intermediário e o sistema excluirá os arquivos por si só. No entanto, se algo der errado com o script, eu tenho todos os meus arquivos intermediários para facilitar a depuração.
Emory

1
+1 para mktemp. Para mim, esta é a resposta correta: delegue a tarefa de criar com segurança um arquivo temporário para mktemp(consulte este artigo ). Embora a única resposta que cite a também FHStenha grande valor.
Carlos Campderrós

Por que você inicializa tmp_rootantes de atribuí-lo? Não seria mais natural unset?
L0b0

@ l0b0 Funcionará (exceto em baixo set -u, mas isso é incomum). Ele precisa ser (des) definido como um valor seguro antes de definir a interceptação, caso o script seja eliminado logo após a definição da interceptação.
Gilles 'SO- stop be evil'

Eu acrescentaria set -o errexitpara que, se tmp_rootjá está definido somente leitura no ambiente que não vai destruir o diretório errado ...
l0b0

2

Apenas para complementar as respostas que já foram publicadas até agora.

Também existem /dev/shmem algumas distribuições Linux que podem ser usadas para armazenamento temporário. Esse armazenamento deve ser usado apenas quando o desempenho da E / S do arquivo for um fator crítico, dado que /dev/shmfaz uso do tmpfssistema de arquivos. Também deve ser usado para arquivos e dados de tamanho razoável. O tmpfssistema de arquivos utiliza uma RAM do sistema como armazenamento, para que não seja persistente de inicialização para inicialização.

Há uma boa visão geral de todas as opções mencionadas aqui no StackOverflow, além das perguntas e respostas, intituladas: / tmp vs. / dev / shm para armazenamento temporário de arquivos no Linux? . Está bem abordado nas perguntas e respostas do superusuário intitulado: Quando devo usar / dev / shm / e quando devo usar / tmp? .

Referências


0

Sim, /tmpé principalmente para arquivos necessários temporariamente. O / tmp possui um bit fixo, o que significa que apenas o proprietário do item, o proprietário do diretório ou o superusuário pode renomear ou excluir arquivos. muitos programas usam isso para criar arquivos de bloqueio e para armazenamento temporário de dados. Em algumas distribuições, esse diretório é limpo na inicialização ou no desligamento.


1
Nem todos os diretórios / tmp são limpos na inicialização. Por exemplo, as instalações padrão do AIX não (e este é o UNIX e Linux, não apenas o Linux).
EightBitTony

No entanto, se for residente na "memória", o que parece ser o padrão em muitos casos, ele desaparece quando o sistema para por qualquer motivo.
Mdpc
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.