Tengo un programa que necesita generar archivos temporales. Está escrito para máquinas de clúster.
Si guardé esos archivos en un directorio temporal de todo el sistema (por ejemplo:) /tmp
, algunos usuarios se quejaron de que el programa falló porque no tenían acceso adecuado a / tmp. Pero si guardaba esos archivos en el directorio de trabajo, esos usuarios también se quejaban de que no querían ver esos archivos misteriosos.
¿Cuál es una mejor práctica? ¿Debo insistir en que guardar /tmp
es el enfoque correcto y defender cualquier falla como "trabajando según lo previsto" (es decir, solicite a su administrador el permiso / acceso adecuado)?
data
file-handling
SmallChess
fuente
fuente
/tmp
un sistema similar a Unix, está mal configurado. El superusuario debería hacer algo asíchmod 1777 /tmp
./tmp/
que debería usar en su lugar. Ver algunas de las respuestas;)Respuestas:
Los archivos temporales deben almacenarse en el directorio temporal del sistema operativo por varias razones:
El sistema operativo hace que sea muy fácil crear esos archivos al tiempo que garantiza que sus nombres sean únicos .
La mayoría del software de respaldo sabe cuáles son los directorios que contienen archivos temporales y los omite. Si usa el directorio actual, podría tener un efecto importante en el tamaño de las copias de seguridad incrementales si las copias de seguridad se realizan con frecuencia.
El directorio temporal puede estar en un disco diferente o en la RAM, lo que hace que el acceso de lectura-escritura sea mucho, mucho más rápido .
Los archivos temporales a menudo se eliminan durante el reinicio (si están en un disco RAM, simplemente se pierden). Esto reduce el riesgo de crecimiento infinito si su aplicación no siempre elimina los archivos temporales correctamente (por ejemplo, después de un bloqueo).
La limpieza de los archivos temporales del directorio de trabajo podría volverse desordenada fácilmente si los archivos se almacenan junto con los archivos de la aplicación y del usuario. Puede mitigar este problema creando un directorio separado dentro del directorio actual, pero esto podría conducir a otro problema:
La longitud del camino podría ser demasiado larga en algunas plataformas. Por ejemplo, en Windows, los límites de ruta para algunas API, marcos y aplicaciones son terribles , lo que significa que puede alcanzar fácilmente dicho límite si el directorio actual ya está en la jerarquía del árbol y los nombres de sus archivos temporales son demasiado largos.
En los servidores, la supervisión del crecimiento del directorio temporal a menudo se realiza de inmediato. Si usa un directorio diferente, es posible que no se controle, y monitorear todo el disco no ayudará a descubrir fácilmente que son los archivos temporales los que ocupan más y más lugar.
En cuanto a los errores de acceso denegado, asegúrese de dejar que el sistema operativo cree un archivo temporal para usted. El sistema operativo puede, por ejemplo, saber que para un usuario determinado, se debe usar un directorio diferente
/tmp
o noC:\Windows\temp
debe usarse; por lo tanto, al acceder a esos directorios directamente, es posible que encuentre un error de acceso denegado.Si obtiene un acceso denegado incluso cuando usa la llamada del sistema operativo, bueno, simplemente significa que la máquina estaba mal configurada; Esto ya fue explicado por Blrfl . Depende del administrador del sistema configurar la máquina; No tiene que cambiar su aplicación.
Crear archivos temporales es sencillo en muchos idiomas. Algunos ejemplos:
Golpetazo:
Pitón:
C#:
PHP:
Rubí:
Tenga en cuenta que en algunos casos, como en PHP y Ruby, el archivo se elimina cuando se cierra el identificador. Ese es un beneficio adicional de usar las bibliotecas incluidas con el lenguaje / marco.
fuente
fopen("/tmp/mytmpfile", "w");
¿debería hacer alguna llamada al sistema para manejar archivos temporales?tmpfile(3)
para generar sus archivos temporales, o al menos llamarmktemp(3)
para crear los nombres de los archivos.Hay estándares para esto, y lo mejor que puedes hacer es cumplir con ellos.
POSIX, que es seguido por casi todos los sistemas operativos no mainframe de cualquier importancia con la que es probable que se encuentre, tiene disposiciones para crear archivos temporales con nombres únicos en un directorio utilizando valores predeterminados que pueden ser reconfigurados por el entorno:
stdio.h
encabezado C puede incluir opcionalmente unaP_tmpdir
macro que nombra el directorio temporal del sistema.TMPDIR
es la variable de entorno canónico para cambiar la ubicación de los archivos temporales. Antes de POSIX, se usaban otras variables, por lo que tiendo a ir con la primera de eso oTMP
,TEMPDIR
yTEMP
eso tiene un valor, puntear y usar el valor predeterminado del sistema si ninguna de ellas existe.mkstemp()
ytempfile()
las funciones generarán archivos temporales únicos.Si a sus usuarios se les niega la capacidad de crear archivos temporales, el sistema está mal configurado o los administradores no están aclarando cuál es su política sobre tales cosas. En esos casos, se mantendría firme al decir que su programa se ajusta a un estándar de portabilidad bien establecido y que su comportamiento se puede cambiar utilizando las variables de entorno que especifica el estándar.
fuente
P_tmpdir
no es parte destdio.h
lo definido por la especificación del lenguaje C. Puede estar definido por POSIX o SVID.pam_tmpdir
: esto estableceTMPDIR
yTMP
debe ser diferente para cada usuario, por su solidez y privacidad. También es útil poder configurarTMPDIR
un solo comando: si tiene su directorio temporal habitual en un sistema de archivos RAM para la velocidad, es posible que deba hacerlo para los comandos que generan enormes archivos temporales (como un gigantesort
, por ejemplo). ¡No ignore los estándares / convenciones que sus usuarios esperan!El directorio de archivos temporales depende en gran medida del sistema operativo / entorno. Por ejemplo, un directorio web-server-temp está separado del os-temp-dir por razones de seguridad.
En ms-windows cada usuario tiene su propio directorio temporal.
debe usar createTempFile () para esto si dicha función está disponible.
fuente
Las respuestas anteriores, aunque correctas, no son válidas para la mayoría de los clústeres de computadoras a gran escala.
Los clústeres de computadoras no siempre siguen las convenciones estándar para las máquinas, generalmente por buenas razones, y no tiene sentido discutirlo con los administradores de sistemas.
Su directorio actual se refiere al sistema de archivos central, al que se accede a través de la red. Esto no solo es lento, sino que también pone cargas en el sistema para el resto de los usuarios, por lo que no debe usarlo a menos que no esté escribiendo mucho y pueda recuperarse si el trabajo falla.
Los nodos de computación tienen su propio disco duro, que es el sistema de archivos más rápido disponible y lo que debería estar usando. La documentación del clúster debería decirle qué es, por lo general
/scratch
,/tmp/[jobid]
o alguna variable de entorno no estándar ($SNIC_TMP
en una de las que uso).Entonces, lo que recomiendo es que sea configurable por el usuario. Los valores predeterminados pueden ser los primeros a los que tiene acceso de escritura:
$TMPDIR
tmpfile
/tmp
.
Pero espere una baja tasa de éxito con este enfoque y asegúrese de emitir una gran advertencia.
Editar: agregaré otra razón para forzarlo a ser configurado por el usuario. Uno de mis clústeres se ha
$TMPDIR
establecido en/scratch
, que puede escribir el usuario y en el disco duro local. Pero, la documentación dice que cualquier cosa que escriba fuera/scratch/[jobid]
puede eliminarse en cualquier momento, incluso en el medio de la ejecución. Entonces, si sigue los estándares y confía$TMPDIR
, encontrará bloqueos aleatorios, muy difíciles de depurar. Entonces, puedes aceptar$TMPDIR
, pero no confiar en él.Algunos otros clústeres tienen esta variable configurada correctamente, por lo que puede agregar una opción para confiar explícitamente
$TMPDIR
, de lo contrario, emitirá una advertencia grande y gorda.fuente
Para muchas aplicaciones, debería considerar poner archivos temporales en
$XDG_RUNTIME_DIR
o$XDG_CACHE_HOME
(los otros directorios XDG son para archivos no temporales). Para obtener instrucciones sobre cómo calcularlos si no se pasan explícitamente en el entorno, consulte la especificación basada en XDG o busque una biblioteca que ya implemente esa parte.Sin embargo,
$XDG_RUNTIME_DIR
tenga en cuenta que se trata de una nueva incorporación y que no existe una reserva estándar para los sistemas más antiguos debido a problemas de seguridad.Si ninguno de esos es adecuado, entonces
/tmp
es el lugar correcto. Usted debe nunca se asume el directorio actual se puede escribir.fuente
Esto es más como una alternativa, pero puede desvincular () el archivo inmediatamente después de fopen (). Depende del patrón de uso de cource.
Desvincular los archivos, si se puede hacer, ayuda de varias maneras:
Los archivos deben crearse en / tmp. Si el usuario no tiene derechos para crear un archivo allí, esto significa que el sistema está mal configurado.
Los archivos no se pueden crear en el directorio de inicio de los usuarios. Muchos usuarios, como "nadie", "www-data" y muchos otros, no tienen derechos para escribir en sus directorios de inicio, o incluso están chroot () - ed. Tenga en cuenta que incluso en el entorno chroot / tmp todavía existe.
fuente