Criar um link simbólico fornece erro de diretório impossível de substituir

Criar um link simbólico fornece erro de diretório impossível de substituir

Eu tenho um aplicativo Django com backend postgresql. O Postgresql cria arquivos temporários de vez em quando - isso pode ser um assassino se o espaço em disco for crítico (como é o meu caso).

Uma maneira de aliviar o problema é criar um link simbólico para algum outro local de armazenamento onde o espaço em disco não seja um gargalo. No meu caso, o postgresql armazena arquivos temporários em /$PGDATA/base/pgsql_tmp. Eu tenho um SSD grande montado em /mnt, então quero que os arquivos temporários residam lá. O seguinte deve cuidar disso:

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 fazer isso na produção, decidi testar localmente. Eu criei /mnte /pgsql_tmpna minha área de trabalho e tentei ln -sTf /home/hassan/Desktop/mnt/pgsql_tmp /home/hassan/Desktop/pgsql_tmp.

Mas isso acaba me dando ln: ‘/home/hassan/Desktop/pgsql_tmp’: cannot overwrite directory. Alguém pode apontar o que estou fazendo de errado? Sendo um neófito, estou realmente tentando entender como isso funciona.

Responder1

Sua melhor aposta é delete ~/pgsql_tmpe deixar o comando ln criá-lo.

Primeiro observe queLNnão vincula dois objetos; ele cria um link para um destino com um nome específico de um local.

ln [OPTION]... [-T] TARGET LINK_NAME

Ao criar um link com ln, o argumento NAME deverá indicar um objeto que ainda não existe e será criado como resultado do comando. No seu caso você já criou ( ~/pgsql_tmp) como um diretório.

Normalmente, você pode usar a -fopção para forçar a exclusão de qualquer coisa que já esteja sobreposta ao caminho do NOME, mas no seu caso você especificou -To que significa que deseja criar o link como um arquivo, não como um diretório. Então, quando -fvai sobrescrever o objeto em NAME, está tentando sobrescrever um diretório por um arquivo.

Portanto, você pode criar o link como um diretório e usar -f, ou pode excluir o objeto que se sobrepõe a NAME e, em seguida, criar seu link. Quanto mais tarde é a melhor opção.

#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

Responder2

Eu sei que é uma pergunta antiga, mas quero adicionar mais detalhes.

De acordo com sua pergunta, sua Source = "/$PGDATA/base/pgsql_tmp" Destination = "/mnt/pgsql_tmp"

Portanto, no destino você não precisa mencionar "pgsql_tmp", ao executar "ln -sf" ele criará um novo "pgsql_tmp" ou, se já existir, simplesmente o vinculará à fonte. Portanto, seu comando deve estar seguindo.

ln -sf /$PGDATA/base/pgsql_tmp /mnt/

O caso mencionado acima é quando você deseja que o link de destino com o mesmo nome da fonte, como "pgsql_tmp", esteja na origem e será o mesmo no destino. Se o nome do diretório de destino for diferente, use a opção T como abaixo.

ln -sfT /$PGDATA/base/pgsql_tmp /mnt/new_dir

informação relacionada