A criação de um link simbólico não pode sobrescrever o erro de diretório

2

Eu tenho um aplicativo Django com um backend postgresql. O Postgresql cria arquivos temporários de vez em quando - isso pode ser fatal 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 é um gargalo. No meu caso, o postgresql armazena arquivos temporários em /$PGDATA/base/pgsql_tmp . Eu tenho um grande SSD montado em /mnt , então eu quero que os arquivos temporários residam lá em vez disso. 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 em produção, decidi testar isso localmente. Eu criei /mnt e /pgsql_tmp na minha área de trabalho e, em seguida, 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 errado? Sendo um neófito, estou realmente tentando entender como isso funciona.

    
por Hassan Baig 19.03.2017 / 18:21

1 resposta

2

Sua melhor aposta é excluir ~/pgsql_tmp e deixar o comando ln criá-lo.

Primeiro, observe que o LN não vincula dois objetos; cria um link para um destino com um nome específico de um lugar.

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

Quando você cria um link com ln , o argumento NAME deve 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 opção -f para forçar a exclusão de qualquer coisa que já sobreponha o caminho do NAME, mas no seu caso você especificou -T , o que significa que você deseja criar o link como um Arquivo, não como um Diretório . Então, quando -f vai sobrescrever o objeto em NAME, ele está tentando sobrescrever um diretório com um arquivo.

Assim, você pode criar o link como um diretório e usar -f, ou você pode excluir o objeto que se sobrepõe a NAME e, em seguida, criar seu link. O último é 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
    
por 19.03.2017 / 21:06