¿Se garantiza / tmp que existe?

42

¿Necesito verificar y crear /tmpantes de escribir en un archivo dentro de él? Supongamos que nadie ha corrido sudo rm -rf /tmpporque es un caso muy raro.

Ayush
fuente
16
¿Qué quieres decir con "garantizado"? El FHS lo requiere, por lo que cualquier distribución que cumpla con el FHS lo tendría. Sin embargo, hay muchas distribuciones de propósito especial que no cumplen con FHS. Ciertamente es posible crear una distribución de Unix / Linux sin / tmp, pero si necesita preocuparse por eso depende completamente de si le importa apoyar esos sistemas.
Lie Ryan
1
¿Por qué no crear su propio directorio temporal y eliminarlo cuando haya terminado con él en lugar de confiar en el próximo reinicio para limpiar?
WGroleau
44
@WGroleau No sé sobre OP, pero en los scripts que escribo para mi propio sistema, generalmente pongo los archivos temporales en un subdirectorio de /tmp(creado con mktemp) y luego elimino ese subdirectorio al salir. La mayor parte de mi sistema está montado de solo lectura y esto evita que tenga que recordarlo cden un directorio de escritura
Fox
1
@WGroleau No estoy confiando en los reinicios para limpiarlo. se mktempve muy bien, probablemente termine de usar eso.
Ayush
77
@jamesqf Sí, no es necesario reiniciar para borrar /tmp. Sin embargo, a la inversa, está permitido hacerlo, y presumiblemente WGroleau ha extrapolado demasiado lejos de eso. Mi /tmpse tmpfsmantiene en la RAM, por lo que se borra al apagar. Aún así, eso es solo un detalle del sistema, que no está garantizado por el FHS. Entonces, para el comentario original, es una locura confiar en la presencia o ausencia de cualquier cosa /tmpentre botas.
underscore_d

Respuestas:

60

El FHS exige que /tmpexista, al igual que POSIX, por lo que puede confiar en que esté allí (al menos en sistemas compatibles, pero realmente está prácticamente garantizado que esté presente en sistemas similares a Unix). Pero no debería: el administrador del sistema o el usuario pueden preferir otras ubicaciones para archivos temporales. Consulte Encontrar el directorio tmp correcto en varias plataformas para obtener más detalles.

Stephen Kitt
fuente
Esto es, por supuesto, un fallo de diseño. /tmpes un nombre $TMPDIRes otro nombre Si no puede contar con /tmpser el nombre correcto del directorio temporal, ¿por qué puede contar con $TMPDIRser el nombre de la variable de entorno correcta? ¿Por qué no debería verificar $TMPDIRVARpara obtener el nombre de esa variable? Un nivel de indirección es suficiente, y /tmpes exactamente eso. No dice nada sobre el almacenamiento real, es solo un nombre.
MSalters
@MSalters hay un poco más que eso. Antes de los espacios de nombres, $TMPDIRpermitía a cada usuario tener un directorio temporal separado, o incluso usar diferentes directorios temporales para diferentes programas; un solo /tmpno proporciona eso (de nuevo, sin espacios de nombres o algo similar). También hay mucha historia (o legado) a tener en cuenta.
Stephen Kitt
Por usuario es un punto válido, pero es por eso que un buen diseño usaría ~/tmppara eso. Que todavía puede ser la misma ubicación física que /tmp, por supuesto.
MSalters
44

En la práctica, /tmpestá prácticamente garantizado de existir. Sin embargo, incluso si existe, eso no significa que deba colocar archivos temporales allí.

La convención estándar es usar la TMPDIRvariable de entorno. Si existe, apunta a un directorio para archivos temporales. Si no existe, coloque archivos temporales en /tmp.

En un script de shell, puede usarlo "${TMPDIR:-/tmp}"como la ubicación del archivo temporal: esto se expande al valor de TMPDIRsi está configurado¹, y de lo /tmpcontrario. O puede configurar TMPDIRcondicionalmente en caso de que no esté configurado, con el comando

: "${TMPDIR:=/tmp}"

y luego crea archivos temporales dentro "$TMPDIR".

Tenga en cuenta que cualquier aplicación puede crear archivos bajo /tmpo $TMPDIR. Además, este directorio puede compartirse entre los usuarios, por lo que debe tener cuidado con los permisos al crear un archivo. Muchos sistemas (Linux, * BSD) tienen un comando mktempque crea archivos de forma segura en el directorio correcto. En general, es una buena idea usar mktemppara crear archivos y directorios temporales, especialmente desde un script de shell, donde es imposible crear un archivo de forma segura en un directorio compartido debido a la posibilidad de ataques de enlace simbólico ( mkdirestá bien si maneja los errores correctamente).

¹ y no vacía - si la variable está vacía, entonces no es utilizable como es de todos modos, y por lo general es una buena idea para tratar las variables vacías o no definidas de la misma manera, si se supone que deben contener un nombre de archivo.

Gilles 'SO- deja de ser malvado'
fuente
11
Tal vez podría mencionar que los usuarios tienen que esperar colisiones de nombres de archivo. Así que la forma en la OMI sólo se recomienda para crear archivos en / tmp es el comando mktempy esto también debe manejar $ TMPDIR" automáticamente.
rudimeier
Esta es la respuesta que quieres. He visto sistemas sin / bin y mucho menos / tmp.
Joshua
1
También A.10 Estructura del directorio y dispositivos indica: ... El /tmpdirectorio se retiene en POSIX.1-2008 para acomodar aplicaciones históricas que asumen su disponibilidad. Se alienta a las implementaciones a proporcionar nombres de directorio adecuados en la variable de entorno TMPDIRy se alienta a las aplicaciones a usar los contenidos TMPDIRpara crear archivos temporales. ...
Andrew Henle
3
Es triste descubrir que mktempno está en POSIX, aunque ya está en los sistemas operativos más populares como GNU (Linux) , OpenBSD , FreeBSD y macOS .
Franklin Yu
1
Podría valer la pena agregar que las mktempfunciones similares están disponibles en muchos lenguajes de programación y programación, como libc , Perl y Python .
Gaurav
6

Aunque es muy probable que exista, debe verificar por otra razón: no se garantiza que sea grande . En muchos sistemas, /tmpestá respaldado por RAM en lugar de disco, y es probable que esté limitado a unos pocos GB. (En los sistemas Fedora, es la mitad de la RAM de forma predeterminada). Por lo tanto, debe verificar no solo la existencia, sino también si hay espacio para poner lo que quiera poner allí.

Si tienes algo grande, úsalo /var/tmp/.

mattdm
fuente
2
No estoy seguro de si es "la forma de Unix" verificar el espacio disponible antes de continuar, especialmente porque no siempre se sabe exactamente cuánto espacio necesitará. En cualquier caso, debe estar preparado para manejar un error de escritura correctamente en caso de que el sistema de archivos se llene; y si vas a hacer eso, ¿qué se gana haciendo una verificación anticipada que será propensa a falsos negativos y positivos?
Nate Eldredge
2
Supongo que depende de lo bien que puedas manejar el caso de falla. El punto principal es no asumir que /tmppuede manejar archivos grandes. Digamos que es una descarga de 10 GB a través de un enlace de velocidad moderada. "Unix way" o no, es bastante miserable descubrir varias horas en que no va a funcionar.
mattdm
1
@mattdm Verificar temprano es bueno, pero la falla tiene que ser manejada. Quizás / tmp tiene 10 GB disponibles cuando comienza la descarga, pero otro usuario copia 5 GB allí mientras se ejecuta la descarga. ¿Ahora que? Je
Zan Lynx
¡Seguro! No me refiero a esto como una excusa para no manejar el fracaso.
mattdm
"Si tiene algo grande": use / tmp y deje que el sistema operativo cambie si es necesario.
UKMonkey