2

У меня есть приложение Django с бэкэндом postgresql. Postgresql время от времени создает временные файлы - это может быть убийственно, если место на диске критично (как в моем случае).

Один из способов решить эту проблему - создать символическую ссылку на другое место хранения, где дисковое пространство не является узким местом. В моем случае postgresql хранит временные файлы в /$PGDATA/base/pgsql_tmp . У меня большой SSD, смонтированный в /mnt , поэтому я хочу, чтобы временные файлы находились там. Следующее должно позаботиться об этом:

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

Прежде чем я сделаю это в производстве, я решил проверить это на месте. Я создал /mnt и /pgsql_tmp на своем рабочем столе, а затем попробовал ln -sTf /home/hassan/Desktop/mnt/pgsql_tmp /home/hassan/Desktop/pgsql_tmp .

Но это приводит к тому, что ln: ‘/home/hassan/Desktop/pgsql_tmp’: cannot overwrite directory . Кто-нибудь может указать, что я делаю не так? Будучи новичком, я действительно пытаюсь понять, как это работает.

1 ответ1

2

Лучше всего удалить ~/pgsql_tmp и позволить команде ln создать его.

Сначала обратите внимание, что LN не связывает два объекта; он создает ссылку на цель с определенным именем из места.

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

Когда вы создаете ссылку с помощью ln , аргумент NAME должен указывать на объект, который еще не существует, и он будет создан в результате выполнения команды. В вашем случае вы уже создали его (~/pgsql_tmp) как каталог.

Обычно вы можете использовать ключ -f для принудительного удаления всего, что уже перекрывает путь NAME, но в вашем случае вы указали -T что означает, что вы хотите создать ссылку как файл, а не как каталог. Поэтому, когда -f перезаписывает объект в NAME, он пытается перезаписать каталог файлом.

Таким образом, вы можете либо создать ссылку в качестве каталога и использовать -f, либо удалить объект, который перекрывает NAME, а затем создать свою ссылку. Позднее это лучший вариант.

#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

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .