¿Cómo evito que se limpie una carpeta dentro de / tmp?

12

Esta pregunta es sobre Ubuntu 14.10 en mi computadora portátil de desarrollador.

Tengo una carpeta /tmpque es utilizada por una aplicación para poner cosas temporales allí. Esta aplicación generalmente crea una carpeta temporal en mi homedir y luego la elimina. Por alguna razón, eso no funciona cuando el homedir está encriptado. Entonces, en cambio, hice un enlace simbólico /tmp/foodentro de mi homedir. Mi aplicación puede escribir allí y hacer que sea una subcarpeta temporal.

Ahora /tmp/foose elimina cada vez que reinicio mi máquina. Hasta ahora, he recreado la carpeta manualmente después de reiniciar. Ahora aprendí en ¿Cómo se limpia el directorio / tmp? que hay un trabajo haciendo eso.

He mirado /etc/init/mounted-tmp.confpero mi bashfu y especialmente mi findfu no son suficientes para hacer lo que quiero. Aquí hay un extracto de ese archivo:

   EXCEPT='! -name .
            ! ( -path ./lost+found -uid 0 )
            ! ( -path ./quota.user -uid 0 )
            ! ( -path ./aquota.user -uid 0 )
            ! ( -path ./quota.group -uid 0 )
            ! ( -path ./aquota.group -uid 0 )
            ! ( -path ./.journal -uid 0 )
            ! ( -path ./.clean -uid 0 )
            ! ( -path "./...security*" -uid 0 )'

   # Remove all old files, then all empty directories
   find . -depth -xdev $TEXPR $EXCEPT ! -type d -delete
   find . -depth -xdev $DEXPR $EXCEPT -type d -empty -delete

Lo que quiero hacer es agregar una condición que lo haga eliminar todo dentro /tmp/foo, pero no a /tmp/foosí mismo. ¿Cómo puedo hacer eso?

simbabque
fuente
¿Es /tmp/fooun directorio o un archivo?
terdon
Un directorio Hay archivos dentro.
simbabque
¿Por qué no agregar mkdir /tmp/foojusto antes end script?
Hagen von Eitzen
Solo para su información (es posible que ya lo sepa): 14.10 llega a EOL en julio de 2015, por lo que realmente debería actualizar a Vivid lo antes posible.
Léo Lam

Respuestas:

20

/etc/init/mounted-tmp.confes parte del mountallpaquete, por lo que cualquier actualización de ese paquete y los cambios sugeridos se revertirán.

$ sudo dpkg -S /etc/init/mounted-tmp.conf 
mountall: /etc/init/mounted-tmp.conf

En cambio, de acuerdo con el estándar de jerarquía del sistema de archivos (FHS) ;

En cuanto a / tmp :

Los programas no deben suponer que los archivos o directorios en / tmp se conservan entre invocaciones del programa.

Con respecto a / var / tmp :

El directorio / var / tmp está disponible para programas que requieren archivos temporales o directorios que se conservan entre los reinicios del sistema. Por lo tanto, los datos almacenados en / var / tmp son más persistentes que los datos en / tmp.

Por lo tanto, debe cambiar su enlace simbólico para usar en /var/tmplugar de /tmp.

mgor
fuente
3
Ejemplo clásico de cuando tienes un martillo, todo parece un clavo.
WernerCD
@WernerCD, ¿podría explicar qué quiere decir con eso? ¿Estás diciendo que /var/tmpno es una buena idea?
simbabque
66
Cuando todo lo que tienes es un martillo ... - If a person is familiar with ... a certain, single instrument, they may have a confirmation bias to believe that it is the answer to/involved in everything.Estoy diciendo que el OP está usando / tmp para algo para lo que no debe usarse - Usando / tmp como un martillo para su problema de mantener tmp-pero-no-del todo -tmp cosas. / var / tmp se DEBE mantener entre reinicios, por lo que es la respuesta correcta.
WernerCD
8

No es estrictamente una respuesta a su pregunta, pero puede encontrar /var/tmpuna ubicación más adecuada, ya que no se limpia durante un reinicio. Está diseñado para archivos temporales que no deben descartarse automáticamente después de un corto tiempo.

Sin embargo, lo que a menudo hago es crearme una carpeta en / opt para almacenar cosas aleatorias que no quiero en casa. Ese es un lugar adecuado para poner cosas que están fuera del control del sistema operativo principal.

Andrew Aylett
fuente
Esta es la idea correcta. Si / tmp no hace lo que desea, almacene su información en otro lugar, incluso en otra unidad si hay espacio disponible. No te metas con cosas que Linux (y otros programadores) esperan que sean de cierta manera a menos que sea la única forma de obtener el resultado que necesitas.
Joe
6

Al igual que:

EXCEPT='! -name .
            ...
            ! ( -path "./foo" )'

   # Remove all old files, then all empty directories
   ...
   find /tmp/foo/* -depth -xdev $TEXPR -delete

Ejemplo:

$ cd /tmp/foo/
$ mkdir 1 2 3
$ touch 3 4 5
$ find /tmp/foo/* -depth -xdev $TEXPR -delete
$ ls /tmp/foo/
$

Estoy de acuerdo con el usuario aap: debe ocuparse de esto en el software utilizado al volver a crear el directorio allí si son archivos tmp o utilizar otro directorio si no son archivos tmp que no se purgan.

Rinzwind
fuente
Esto en realidad no funciona. Si bien el findcomando funciona como se espera cuando se ejecuta manualmente, el directorio aún se elimina después de la edición /etc/init/mounted-tmp.conf. Parece que hay algo más aquí.
terdon
wth. ehm eso debería significar que la primera línea está defectuosa. tal vez tenga que ser relativo (?)
Rinzwind
@terdon sí parece que necesita ser relativo a / tmp /
Rinzwind
No lo creo, probé varias permutaciones, incluidas -path ./fooe incluso, -name '*foo*'y ninguna funcionó (en Ubuntu Server 14.04). Creo que ese no es el archivo correcto y estamos buscando en el lugar equivocado. Lo que estás sugiriendo debería funcionar, simplemente no parece.
terdon
0

Es una mala idea tener archivos con valor futuro, escribir en el directorio / tmp (/ var / tmp, como lo sugieren otros, es un lugar mejor). Dicho esto, es posible que desee darle una oportunidad a chattr. Esto debe ejecutarse después de que la aplicación salga, pero antes de un apagado. Recuerde que esta operación no permitirá que nada escriba en ese directorio en adelante.

toque /tmp/foo/ddmmyy/.001_immute_me chattr + i /tmp/foo/ddmmyy/.001_immute_me

Saltando conejito
fuente
¿Cómo sería eso útil si quiero tener un directorio temporal?
simbabque
-1

Ejecuta esto:

echo "if [ ! -e /etc/foo/ ]; then mkdir /etc/foo/; fi; rm -rf /etc/foo/*" > /bin/foodel; sudo chmod 755 /bin/foodel 

luego agregue esto a / etc / inittab, vea aquí: ¿ dónde está el archivo inittab? :

foo:2345:boot:/bin/foodel

Eso creará / etc / foo en el arranque si no existe, y luego lo vaciará.

Esto hará lo mismo en bash login:

echo "/bin/foodel" >> ~/.bashrc
Daniel
fuente
Ubuntu versión 14 no usa /etc/inittab. Esto se afirma clara e inequívocamente en su página de manual.
JdeBP
* facepalm * Lo siento @JdeBP, esto es lo que me pasa después de hacer malabarismos con 4 versiones diferentes de Linux. Puede poner el código en algún lugar indicado askubuntu.com/questions/34308/where-is-inittab-file
Daniel