Eu tenho um programa que precisa gerar arquivos temporários. Está escrito para máquinas de cluster.
Se eu salvei esses arquivos em um diretório temporário em todo o sistema (por exemplo /tmp
:), alguns usuários reclamaram que o programa falhou porque não tinham acesso adequado ao / tmp. Mas se eu salvei esses arquivos no diretório de trabalho, esses usuários também reclamaram que não queriam ver esses arquivos misteriosos.
Qual é a melhor prática? Devo insistir que salvar para /tmp
é a abordagem correta e defender qualquer falha como "funcionando como pretendido" (por exemplo, solicite ao administrador permissão / acesso adequados)?
data
file-handling
SmallChess
fonte
fonte
/tmp
um sistema semelhante ao Unix, isso foi configurado incorretamente. O superusuário deve fazer algo parecidochmod 1777 /tmp
./tmp/
que você deve usar. Veja algumas das respostas;)Respostas:
Os arquivos temporários precisam ser armazenados no diretório temporário do sistema operacional por vários motivos:
O sistema operacional facilita a criação desses arquivos, garantindo que seus nomes sejam exclusivos .
A maioria dos softwares de backup sabe quais são os diretórios que contêm arquivos temporários e os ignora. Se você usar o diretório atual, poderá ter um efeito importante no tamanho dos backups incrementais, se os backups forem feitos com freqüência.
O diretório temporário pode estar em um disco diferente ou na RAM, tornando o acesso de leitura e gravação muito, muito mais rápido .
Os arquivos temporários são freqüentemente excluídos durante a reinicialização (se estiverem em um ramdisk, eles serão simplesmente perdidos). Isso reduz o risco de crescimento infinito se o seu aplicativo nem sempre remover os arquivos temporários corretamente (por exemplo, após uma falha).
A limpeza de arquivos temporários do diretório de trabalho pode facilmente tornar-se uma bagunça se os arquivos forem armazenados juntamente com os arquivos do aplicativo e do usuário. Você pode atenuar esse problema criando um diretório separado no diretório atual, mas isso pode levar a outro problema:
O comprimento do caminho pode ser muito longo em algumas plataformas. Por exemplo, no Windows, os limites de caminho para algumas APIs, estruturas e aplicativos são terríveis , o que significa que você pode atingir facilmente esse limite se o diretório atual já estiver dentro da hierarquia da árvore e os nomes de seus arquivos temporários forem muito longos.
Nos servidores, o monitoramento do crescimento do diretório temporário geralmente é feito imediatamente. Se você usar um diretório diferente, ele poderá não ser monitorado, e o monitoramento de todo o disco não ajudará a descobrir facilmente que são os arquivos temporários que ocupam cada vez mais espaço.
Quanto aos erros de acesso negado, deixe o sistema operacional criar um arquivo temporário para você. O sistema operacional pode, por exemplo, saber que, para um determinado usuário, um diretório diferente
/tmp
ouC:\Windows\temp
deve ser usado; portanto, acessando esses diretórios diretamente, você pode realmente encontrar um erro de acesso negado.Se você receber um acesso negado, mesmo ao usar a chamada do sistema operacional, isso significa simplesmente que a máquina estava mal configurada; isso já foi explicado pela Blrfl . Cabe ao administrador do sistema configurar a máquina; você não precisa alterar seu aplicativo.
A criação de arquivos temporários é direta em muitos idiomas. Alguns exemplos:
Bater:
Pitão:
C #:
PHP:
Rubi:
Observe que em alguns casos, como no PHP e Ruby, o arquivo é removido quando o identificador é fechado. Esse é um benefício adicional de usar as bibliotecas incluídas na linguagem / estrutura.
fonte
fopen("/tmp/mytmpfile", "w");
eu deveria fazer alguma chamada do sistema para lidar com arquivos temporários?tmpfile(3)
para gerar seus arquivos temporários, ou pelo menos ligandomktemp(3)
para criar os nomes dos arquivos.Existem padrões para isso, e a melhor coisa que você pode fazer é obedecer a eles.
O POSIX, que é seguido por praticamente todos os SOs não mainframe de qualquer significado que você possa encontrar, possui disposições para a criação de arquivos temporários nomeados exclusivamente em um diretório usando valores padrão que podem ser reconfigurados pelo ambiente:
stdio.h
cabeçalho C pode opcionalmente incluir umaP_tmpdir
macro que nomeie o diretório temporário do sistema.TMPDIR
é a variável de ambiente canônica para alterar o local dos arquivos temporários. Antes do POSIX, havia outras variáveis usadas, então eu costumo ir com a primeira daquilo ouTMP
,TEMPDIR
eTEMP
isso tem um valor, puncionar e usar o padrão do sistema, se nenhuma delas existir.mkstemp()
etempfile()
irão gerar arquivos temporários exclusivos.Se for negado aos usuários a capacidade de criar arquivos temporários, o sistema está configurado incorretamente ou os administradores não estão deixando claro qual é sua política nessas coisas. Nesses casos, você estaria muito firme ao dizer que seu programa está em conformidade com um padrão de portabilidade bem estabelecido e que seu comportamento pode ser alterado usando as variáveis de ambiente especificadas pelo padrão.
fonte
P_tmpdir
não faz parte dastdio.h
definição da especificação da linguagem C. Pode ser definido pelo POSIX ou SVID.pam_tmpdir
- isso defineTMPDIR
eTMP
deve ser diferente para cada usuário, para robustez e privacidade. Também é útil poder definirTMPDIR
um único comando - se você tiver o diretório temporário habitual em um sistema de arquivos RAM para obter velocidade, talvez seja necessário fazer isso para comandos que geram arquivos temporários enormes (como um gigantesort
, por exemplo). Não ignore os padrões / convenções que seus usuários esperam!O diretório temporário-arquivo é altamente dependente do sistema operacional / ambiente. Por exemplo, um diretório web-servers-temp é separado do os-temp-dir por motivos de segurança.
Sob ms-windows, todo usuário tem seu próprio temp-dir.
você deve usar o createTempFile () para isso, se essa função estiver disponível.
fonte
As respostas anteriores, embora corretas, não são válidas para a maioria dos clusters de computadores em grande escala.
Os clusters de computadores nem sempre seguem as convenções padrão das máquinas, geralmente por boas razões, e não faz sentido discutir isso com os administradores de sistemas.
Seu diretório atual está se referindo ao sistema de arquivos central, que é acessado através da rede. Isso não é apenas lento, mas também sobrecarrega o sistema para o resto dos usuários; portanto, você não deve usá-lo, a menos que não esteja escrevendo muito e possa se recuperar se o trabalho falhar.
Os nós de computação têm seu próprio disco rígido, que é o sistema de arquivos mais rápido disponível e o que você deve usar. A documentação do cluster deve informar o que é, normalmente
/scratch
,/tmp/[jobid]
ou alguma variável de ambiente não padrão ($SNIC_TMP
em uma das que eu uso).Então, o que eu recomendo é torná-lo configurável pelo usuário. Os padrões podem ser os primeiros aos quais você tem acesso de gravação:
$TMPDIR
tmpfile
/tmp
.
Mas espere uma baixa taxa de sucesso com essa abordagem e certifique-se de emitir um grande aviso.
Editar: adicionarei outro motivo para forçá-lo a ser definido pelo usuário. Um dos meus clusters foi
$TMPDIR
definido como/scratch
gravável pelo usuário e no disco rígido local. Porém, a documentação diz que tudo o que você escreve fora/scratch/[jobid]
pode ser excluído a qualquer momento, mesmo no meio da execução. Portanto, se você seguir os padrões e confiar$TMPDIR
, encontrará falhas aleatórias, muito difíceis de depurar. Portanto, você pode aceitar$TMPDIR
, mas não confiar nele.Alguns outros clusters têm essa variável configurada corretamente; portanto, você pode adicionar uma opção para confiar explicitamente
$TMPDIR
; caso contrário, emitir um aviso grande e gordo.fonte
Para muitos aplicativos, considere colocar arquivos temporários em
$XDG_RUNTIME_DIR
ou$XDG_CACHE_HOME
(os outros diretórios XDG são para arquivos não temporários ). Para obter instruções sobre como calculá-las se elas não forem explicitamente transmitidas no ambiente, consulte a especificação XDG basedir ou encontre uma biblioteca que já implemente essa parte.Observe, no entanto, que
$XDG_RUNTIME_DIR
é uma nova adição e não há fallback padrão para sistemas mais antigos devido a problemas de segurança.Se nenhum deles for adequado, então
/tmp
é o local correto. Você nunca deve assumir que o diretório atual é gravável.fonte
É mais uma alternativa, mas você pode desvincular () o arquivo imediatamente após fopen (). Depende do padrão de uso da cource.
Desvincular os arquivos, se possível, ajuda de várias maneiras:
Os arquivos devem ser criados em / tmp. Se o usuário não tiver direitos para criar um arquivo, isso significa que o sistema está configurado incorretamente.
Os arquivos não podem ser criados no diretório inicial do usuário. Muitos usuários, como "ninguém", "www-data" e muitos outros, não têm direitos para escrever em seus diretórios pessoais ou são até chroot (). Observe que mesmo no ambiente chroot / tmp ainda existe.
fonte