/ tmp é garantido que existe?


42

Preciso verificar e criar /tmpantes de gravar em um arquivo dentro dele? Suponha que ninguém tenha corrido sudo rm -rf /tmpporque esse é um caso muito raro


16
O que você quer dizer com "garantido"? A ESF exige, portanto, qualquer distro compatível com a ESF o teria. No entanto, existem muitas distribuições para fins especiais que não são compatíveis com a FHS. Certamente é possível criar uma distribuição Unix / Linux sem / tmp, mas se você precisa se preocupar totalmente com isso depende se você se preocupa em dar suporte a esses sistemas.
Lie Ryan

1
Por que não criar seu próprio diretório temporário e excluí-lo quando terminar, em vez de depender da próxima reinicialização para limpar?
WGroleau 29/04

4
@WGroleau Eu não sei sobre OP, mas em scripts que escrevo para o meu próprio sistema, geralmente coloco arquivos temporários em um subdiretório de /tmp(criado com mktemp) e removo esse subdiretório na saída. A maioria do meu sistema é montado somente leitura e isso me impede de ter que lembrar de cdum diretório gravável
Fox

1
@WGroleau Não estou confiando em reinicializações para limpá-lo. as mktempparece realmente grande, I'l provavelmente acabar usando isso.
precisa

7
@jamesqf Sim, a reinicialização não é necessário para limpar /tmp. No entanto, inversamente, é permitido fazê-lo e, presumivelmente, o WGroleau extrapolou muito longe disso. Meu /tmpé tmpfsretido na RAM, por isso é limpo no desligamento. Ainda assim, isso é apenas um detalhe do sistema, que não é garantido pela ESF. Portanto, para o comentário original, é tolice contar com a presença ou ausência de qualquer coisa /tmpentre as botas.
underscore_d

Respostas:


60

O FHS exige que /tmpexista, assim como o POSIX, para que você possa confiar nele (pelo menos em sistemas compatíveis; mas, na verdade, é praticamente garantido que ele esteja presente em sistemas similares ao Unix). Mas você não deve: o administrador do sistema ou o usuário pode preferir outros locais para arquivos temporários. Consulte Localizando o diretório tmp correto em várias plataformas para obter mais detalhes.


Obviamente, isso é uma falha de design. /tmpé um nome. $TMPDIRé outro nome. Se você não pode /tmpser o nome correto do diretório temporário, por que pode $TMPDIRser o nome da variável de ambiente correta? Por que não devo verificar $TMPDIRVARo nome dessa variável? Um nível de indireção é suficiente, e /tmpé exatamente isso. Não diz nada sobre o armazenamento real, é apenas um nome.
MSalters

@MSalters Há um pouco mais do que isso. Antes dos namespaces, $TMPDIRpermitia que cada usuário tivesse um diretório temporário separado ou mesmo usasse diretórios temporários diferentes para programas diferentes; um single /tmpnão fornece isso (novamente, sem espaços para nome ou algo semelhante). Também há muita história (ou legado) a ser levada em consideração.
Stephen Kitt

Por usuário é um ponto válido, mas é por isso que um bom design usaria ~/tmppara isso. Que ainda pode ser o mesmo local físico /tmp, é claro.
MSalters

44

Na prática, /tmpé praticamente garantido que existe. No entanto, mesmo que exista, isso não significa que você deve colocar arquivos temporários lá.

A convenção padrão é usar a TMPDIRvariável de ambiente. Se existir, ele aponta para um diretório para arquivos temporários. Se não existir, insira arquivos temporários /tmp.

Em um script de shell, você pode usar "${TMPDIR:-/tmp}"como o local do arquivo temporário: isso se expande para o valor de TMPDIRse estiver configurado¹ e para o /tmpcontrário. Ou você pode definir TMPDIRcondicionalmente, caso não esteja definido , com o comando

: "${TMPDIR:=/tmp}"

e crie arquivos temporários dentro "$TMPDIR".

Observe que qualquer aplicativo pode criar arquivos em /tmpou $TMPDIR. Além disso, esse diretório pode ser compartilhado entre usuários, portanto, é necessário ter cuidado com as permissões ao criar um arquivo. Muitos sistemas (Linux, * BSD) possuem um comando mktempque cria arquivos com segurança no diretório certo. Geralmente, é uma boa ideia usar mktemppara criar arquivos e diretórios temporários - especialmente a partir de um script de shell, onde é impossível criar um arquivo com segurança em um diretório compartilhado devido à possibilidade de ataques de link simbólico (tudo mkdirbem se você manipular erros corretamente).

¹ e não vazio - se a variável estiver vazia, não poderá ser usada como está, e geralmente é uma boa idéia tratar variáveis ​​vazias ou não definidas da mesma maneira se elas devem conter um nome de arquivo.


11
Talvez você possa mencionar que os usuários precisam esperar colisões de nomes de arquivos. Então IMO a única maneira recomendada para criar arquivos em / tmp é o comando mktempe isso deve também lidar com $ TMPDIR" automaticamente.
rudimeier

Esta é a resposta que você deseja. Eu já vi sistemas sem / bin e muito menos / tmp.
21717 Joshua

1
Também A.10 Estrutura e Diretórios de Dispositivos declara: ... O /tmpdiretório é mantido no POSIX.1-2008 para acomodar aplicativos históricos que assumem sua disponibilidade. As implementações são incentivadas a fornecer nomes de diretório adequados na variável de ambiente TMPDIRe os aplicativos são incentivados a usar o conteúdo TMPDIRpara criar arquivos temporários. ...
Andrew Henle

3
É triste descobrir que isso mktempnão está no POSIX, embora já esteja nos sistemas operacionais mais populares, como GNU (Linux) , OpenBSD , FreeBSD e macOS .
Franklin Yu

1
Pode valer a pena acrescentar que mktempfunções semelhantes estão disponíveis em muitas linguagens de script e de programação, como libc , Perl e Python .
Gaurav

6

Embora seja provável que exista, você deve verificar por outro motivo: não é garantido que seja grande . Em muitos sistemas, /tmpé suportado por RAM e não por disco, e provavelmente limitado a alguns GB. (Nos sistemas Fedora, é metade da RAM por padrão.) Portanto, você deve verificar não apenas a existência, mas também se há espaço para colocar o que você pretende colocar lá.

Se você tem algo grande, use /var/tmp/.


2
Não tenho certeza se é "a maneira do Unix" verificar o espaço disponível antes de prosseguir, especialmente porque nem sempre se sabe exatamente quanto espaço você precisará. De qualquer forma, você deve estar preparado para lidar com um erro de gravação normalmente, caso o sistema de arquivos fique cheio; e se você fizer isso, o que é ganho com uma verificação prévia que estará sujeita a falsos negativos e positivos?
Node Eldredge

2
Depende de quão graciosamente você pode lidar com o caso de falha, eu acho. O ponto principal é não supor que /tmppossa lidar com arquivos grandes. Digamos que seja um download de 10 GB em um link de velocidade moderada. "Unix way" ou não, é bastante infeliz descobrir várias horas em que não vai funcionar.
Mattdm 01/05

1
@mattdm A verificação antecipada é agradável, mas a falha deve ser tratada. Talvez o / tmp tenha 10 GB disponíveis quando o download for iniciado, mas Outro Usuário copia 5 GB para lá enquanto o download está em execução. O que agora? Heh.
Zan Lynx

Definitivamente! Não quero dizer isso como uma desculpa para não lidar com o fracasso.
Mattdm 01/05/19

"Se você tem algo grande" - use / tmp e deixe o sistema operacional trocar, se necessário.
UKMonkey
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.