¿En qué carpeta debo escribir para mis archivos intermedios, como desarrollador?


17

Estoy empezando a escribir algunos scripts de bash para mi proyecto y necesitan algunos archivos intermedios o variables para ser escritos.

¿Quiero saber a qué carpetas puedo estar seguro de tener acceso cuando alguien ejecuta mi script? ¿Es una práctica común de usar /tmp/? ¿O debería usar algo más?

Respuestas:


21

El documento estándar de jerarquía del sistema de archivos me parece invaluable cuando busco estas cosas.

Hay algunas opciones,

  • / tmp : archivos temporales 'no permanentes'
  • / var / tmp - archivos temporales 'permanentes'
  • / var / cache - archivos de datos transitorios de 'aplicación'

Realmente depende del tipo de datos que esté almacenando.


use mejor lo que le da el usuario / entorno y solo use / tmp, etc. como reserva. (lo que dijo unix.stackexchange.com/a/79776/7784 )
Oluf Lorenzen

15

Si tiene que escribir algunos archivos temporales que sólo duran tanto como la secuencia de comandos o la aplicación se está ejecutando, utilice el directorio indicado por la TMPDIRvariable de entorno, o si no se define esta variable, /tmp.

/tmpse borra en el momento del arranque en algunos sistemas (a veces incluso está en la RAM, por ejemplo, en Solaris y en algunas instalaciones de Linux), por lo que no se puede usar para archivos que deben sobrevivir a una falla de energía o un reinicio. /var/tmpse puede usar para archivos que deben sobrevivir al reinicio, pero que el administrador del sistema puede limpiar de vez en cuando. Si su aplicación necesita guardar archivos de manera permanente, escríbalos en algún lugar del directorio de inicio del usuario (en ~/.programmingnoobsappo ~/.cache/programmingnoobsapp) o debajo de /var/lib/programmingnoobsappo /var/cache/programmingnoobsapp.

Tenga en cuenta que /tmpse comparte entre todos los usuarios, por lo que debe tomar precauciones al crear un archivo allí. Debe elegir un nombre de archivo que aún no existe, y debe tener cuidado de no permitir una condición de carrera en la que otro proceso cree el archivo por delante con diferentes permisos, lo que podría ser un agujero de seguridad (si el otro proceso se ejecuta como un usuario diferente, podría acceder y modificar los datos de su proceso). Use el mktempcomando para crear un archivo en /tmpo /var/tmp. De manera predeterminada, mktempcrea un archivo $TMPDIR, o /tmpsi no TMPDIRestá configurado, que generalmente es el lugar correcto. Si necesita usar varios archivos temporales, o incluso si necesita uno solo, le recomiendo crear un directorio para todos sus archivos temporales conmktemp -d y eliminarlo al final de su secuencia de comandos.

#!/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 to mktemp, no elimino los archivos temporales al final de mi script. Tengo un trabajo cron de tmpwatch que elimina automáticamente los archivos antiguos. En la gran mayoría de los casos, no leo el archivo intermedio y el sistema eliminará los archivos por sí mismo. Sin embargo, si algo sale mal con el script, tengo todos mis archivos intermedios para una fácil depuración.
emory

1
+1 para mktemp. Para mí, esta es la respuesta correcta: delegar la tarea de crear de manera segura un archivo temporal para mktemp(vea este artículo ). Aunque la única respuesta que cita FHStiene un gran valor también.
Carlos Campderrós

¿Por qué inicializas tmp_rootantes de asignarlo? ¿No sería más natural unset?
l0b0

@ l0b0 Cualquiera funcionará (excepto en virtud de set -u, pero eso es poco común). Debe (des) establecerse en un valor seguro antes de configurar la trampa, en caso de que el script se elimine justo después de configurar la trampa.
Gilles 'SO- deja de ser malvado'

Yo añadiría set -o errexitpor lo que si tmp_rootya está establecido de sólo lectura en el medio ambiente y no os destruirá el directorio equivocado ...
l0b0

2

Solo para complementar las respuestas que ya se han publicado hasta ahora.

También hay /dev/shmalgunas distribuciones de Linux que se pueden usar para almacenamiento temporal. Este almacenamiento solo debe usarse cuando el rendimiento del archivo I / O es un factor crítico dado /dev/shmque utiliza el tmpfssistema de archivos. También debe usarse para archivos y datos de tamaño razonable. El tmpfssistema de archivos utiliza una RAM del sistema como almacenamiento, por lo que no es persistente de arranque a arranque.

Hay una buena descripción general de todas las opciones mencionadas aquí en StackOverflow también en este Q&A titulado: / tmp vs. / dev / shm para el almacenamiento de archivos temporales en Linux. . Está bien cubierto en este SuperUser Q&A titulado: ¿ Cuándo debo usar / dev / shm / y cuándo debo usar / tmp? .

Referencias


0

Sí, /tmpes principalmente para archivos que se requieren temporalmente. El / tmp tiene un bit fijo que significa que solo el propietario del elemento, el propietario del directorio o el superusuario pueden cambiar el nombre o eliminar archivos. muchos programas usan esto para crear archivos de bloqueo y para el almacenamiento temporal de datos. En alguna distribución, este directorio se borra en el arranque o apagado.


1
No todos los directorios / tmp se borran en el arranque. Por ejemplo, las instalaciones predeterminadas de AIX no (y esto es UNIX y Linux, no solo Linux).
EightBitTony

Sin embargo, si es residente de "memoria", que parece ser el predeterminado en muchos casos, desaparece cuando el sistema se detiene por cualquier motivo.
mdpc
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.