Evitar que se elimine un directorio en / tmp

10

A menudo uso el /tmpdirectorio en mi máquina Linux para almacenar archivos temporales (por ejemplo, archivos PDF de un sitio que quiere que lo descargue primero, etc.) y a menudo creo un directorio con mi nombre de usuario. Pero en cada inicio se elimina (incluidos todos los archivos). Ahora sé que puedo ponerlo /var/tmp, pero quiero que se elimine todo su contenido, pero que se mantenga el directorio en sí. Entonces:

tmp
 |- me # this should stay
 |  |- foo1 # this should be deleted...
 |  |- bar1 # ...and this as well
 |- other stuff...

¿Hay alguna forma de hacer esto? ¿Quizás con permisos o con una configuración especial?

Linux4win
fuente
1
Como solución alternativa, puede poner algo de código en los archivos de inicio de sesión de su shell para "probar y mkdir" según sea necesario.
Jeff Schaller
3
/tmpEs probable que sea un tmpfssistema de archivos. Esos archivos no se eliminan realmente; simplemente se almacenan en la RAM y se pierden al reiniciar. Es por eso que obtienes respuestas que se reducen a "volver a crearlo en el arranque o iniciar sesión"
MSalters

Respuestas:

4

Una solución sería usar un @reboottrabajo cron:

@reboot mkdir -p "/tmp/$USER"

Agregar esto a su crontab crontab -eharía que se ejecute siempre que la máquina se inicie.

O usar

mkdir -p "/tmp/$USER"

en el archivo de inicio de su shell.

En cualquier caso, es posible que también desee utilizar

TMPDIR=/tmp/$USER
export TMPDIR

en el archivo de inicio de su shell si desea usar ese directorio como el directorio temporal predeterminado.

Kusalananda
fuente
¿Esto a) creará directorios para todos los usuarios yb) también se activará desde el inicio 'en frío'?
Linux4win
1
@ Linux4win Esta respuesta responde a las necesidades de un solo usuario, porque así es como formuló la pregunta. No importa cómo se inicie la máquina (caliente, fría o tibia), pero no se activará cuando se reanude desde la hibernación (porque eso no se inicia).
Kusalananda
Por alguna razón, agregar @reboot mkdir -p "/tmp/$USER"al final del crontab no hace nada, mientras que la ejecución mkdir -p "/tmp/$USER"realmente crea el directorio. Por cierto, el segundo no me funciona, porque necesito acceder a mi a /tmptravés de otros programas, y
activar
@ Linux4win ¿El @reboottrabajo cron no crea un directorio? ¿Recibes algún correo electrónico enviado a tu cuenta con algún mensaje de error del demonio cron?
Kusalananda
bueno no ... tal vez porque no lo he configurado mail? ¿O eso no es obligatorio?
Linux4win
14

Lo uso pam-tmpdirpara esto: crea un directorio temporal privado de usuario al iniciar sesión. Para configurarlo, agregue

session optional pam_tmpdir.so

a los servicios PAM apropiados; en un sistema basado en Debian, la instalación del libpam-tmpdirpaquete ofrecerá hacer esto por usted, o puede agregar la línea /etc/pam.d/common-session. La próxima vez que inicie sesión, encontrará un directorio /tmp/usercon su ID de usuario TMPy TMPDIRestablecerá adecuadamente.

Stephen Kitt
fuente
77
¿Podría explicar cuáles son los servicios PAM apropiados y cómo se les puede agregar la línea? ¿Qué archivos deben editarse?
terdon
2

Si no está ejecutando un sistema con systemd y utiliza systemd-tmpfiles para administrar la limpieza, entonces debe configurar el directorio utilizando ese sistema.

Aquí hay una documentación completa . Es probable que pueda lograr lo que desea creando /etc/tmpfiles.d/something.confcon contenidos como:

d     /tmp/your_username   0750 your_user your_group  - -
viraptor
fuente
1

Como se señaló en los comentarios, /tmpes para archivos que son transitorios y que no se perderán si se eliminan. Si estás en medio de algo y la máquina se reinicia, todo lo que hayas escrito allí desaparecerá y tendrás que comenzar de nuevo, lo que significa que esos archivos podrían no haber sido tan temporales después de todo.

Mantuve un directorio temporal en mi directorio de inicio durante muchos años, comenzando cuando un gigabyte era mucho espacio y descubrí que requería una limpieza periódica para deshacerse de los archivos que se habían vuelto viejos y defectuosos. La mayoría de las veces lo que me quedaba después de ese proceso tenía menos de un par de semanas, así que ahora lo limpio con un trabajo cron que se ejecuta una vez al día:

find $HOME/tmp -depth -mtime +30 -print0 | xargs -0 -r rm -rf

Todo lo que descargo o creo como semi-temporal va allí y el sistema limpia todo lo que dejo. Cualquier cosa que necesite un hogar permanente se obtiene mucho antes de que el trabajo cron se deshaga de él.

Blrfl
fuente
mkdir a a/b; touch a/b/c. Ahora espere hasta que hayan expirado sus 30 días. A medida que lo elimine, cse actualizará b, lo que significará que tendrá que esperar otros 30 días. Del mismo modo con acuando eliminas b. En segundo lugar, si crea archivos bpero no los toca adurante 30 días, el adirectorio se verá afectado rm -rfy borrará sus archivos recientes b.
roaima
find "$HOME"/tmp -mtime +30 -type f -delete; find "$HOME/tmp" -depth -mmin +60 -type d -exec rmdir {} + 2>/dev/nullfunciona para mí
roaima