Tengo una aplicación Django con un backend postgresql. Postgresql crea archivos temporales de vez en cuando; esto puede ser mortal si el espacio en disco es crítico (como es mi caso).
Una forma de aliviar el problema es crear un enlace simbólico a alguna otra ubicación de almacenamiento donde el espacio en disco no sea un cuello de botella. En mi caso, postgresql almacena archivos temporales en /$PGDATA/base/pgsql_tmp
. Tengo un SSD grande montado en /mnt
, por lo que quiero que los archivos temporales residan allí. Lo siguiente debería encargarse de esto:
ln -sTf /mnt/pgsql_tmp $PGDATA/base/pgsql_tmp
chown -R postgres /mnt/pgsql_tmp #ensuring user 'postgres' has the right perms
chmod o+x /mnt
Antes de hacer esto en producción, decidí probarlo localmente. Creé /mnt
y /pgsql_tmp
en mi escritorio y luego probé ln -sTf /home/hassan/Desktop/mnt/pgsql_tmp /home/hassan/Desktop/pgsql_tmp
.
Pero esto me termina dando ln: ‘/home/hassan/Desktop/pgsql_tmp’: cannot overwrite directory
. ¿Alguien puede señalar qué estoy haciendo mal? Siendo un neófito, realmente estoy tratando de entender cómo funciona esto.
Respuesta1
Lo mejor que puede hacer es eliminarlo ~/pgsql_tmp
y dejar que el comando ln lo cree.
Primero tenga en cuenta queLNno vincula dos objetos; crea un enlace a un objetivo con un nombre específico de un lugar.
ln [OPTION]... [-T] TARGET LINK_NAME
Cuando crea un enlace con ln
, el argumento NOMBRE debe indicar un objeto que aún no existe y se creará como resultado del comando. En tu caso ya lo creaste ( ~/pgsql_tmp
) como directorio.
Por lo general, puede usar el -f
interruptor para forzar la eliminación de cualquier cosa que ya se superponga a la ruta del NOMBRE, pero en su caso especificó -T
lo que significa que desea crear el enlace como un archivo, no como un directorio. Entonces, cuando -f
va a sobrescribir el objeto en NOMBRE, intenta sobrescribir un directorio con un archivo.
Entonces, puede crear el enlace como un directorio y usar -f, o puede eliminar el objeto que se superpone a NOMBRE y luego crear su enlace. La última es la mejor opción.
#create a test target with a file, but without an object at lnname
~/tmp$ mkdir lntarget
~/tmp$ touch lntarget/contentfile1
~/tmp$ ln -sTf lntarget lnname
~/tmp$ ls ./lnname
contentfile1
Respuesta2
Sé que es una pregunta antigua, pero quiero agregar más detalles.
Según su pregunta, su Fuente = "/$PGDATA/base/pgsql_tmp" Destino = "/mnt/pgsql_tmp"
Entonces, en el destino no es necesario mencionar "pgsql_tmp", cuando ejecute "ln -sf" creará un nuevo "pgsql_tmp" o, si ya existe, simplemente lo vinculará al origen. Entonces tu comando debería seguirse.
ln -sf /$PGDATA/base/pgsql_tmp /mnt/
El caso mencionado anteriormente es cuando desea tener un enlace de destino con el mismo nombre que la fuente, como "pgsql_tmp" en la fuente y será el mismo en el destino. Si el nombre del directorio de destino es diferente, utilice el interruptor T como se muestra a continuación.
ln -sfT /$PGDATA/base/pgsql_tmp /mnt/new_dir