Al crear un enlace simbólico no se puede sobrescribir el error de directorio

Al crear un enlace simbólico no se puede sobrescribir el error de directorio

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é /mnty /pgsql_tmpen 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_tmpy 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 -finterruptor para forzar la eliminación de cualquier cosa que ya se superponga a la ruta del NOMBRE, pero en su caso especificó -Tlo que significa que desea crear el enlace como un archivo, no como un directorio. Entonces, cuando -fva 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

información relacionada