Ich habe eine Django-App mit einem PostgreSQL-Backend. PostgreSQL erstellt hin und wieder temporäre Dateien – das kann ein Killer sein, wenn der Speicherplatz kritisch ist (wie in meinem Fall).
Eine Möglichkeit, das Problem zu lindern, besteht darin, einen symbolischen Link zu einem anderen Speicherort zu erstellen, an dem der Speicherplatz kein Engpass ist. In meinem Fall speichert PostgreSQL temporäre Dateien unter /$PGDATA/base/pgsql_tmp
. Ich habe eine große SSD unter installiert /mnt
, daher möchte ich, dass die temporären Dateien stattdessen dort gespeichert werden. Folgendes sollte dies beheben:
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
Bevor ich dies in der Produktion mache, habe ich beschlossen, es lokal zu testen. Ich habe /mnt
und /pgsql_tmp
auf meinem Desktop erstellt und dann ausprobiert ln -sTf /home/hassan/Desktop/mnt/pgsql_tmp /home/hassan/Desktop/pgsql_tmp
.
Aber am Ende bekomme ich ln: ‘/home/hassan/Desktop/pgsql_tmp’: cannot overwrite directory
. Kann mir jemand sagen, was ich falsch mache? Als Neuling versuche ich wirklich herauszufinden, wie das funktioniert.
Antwort1
Am besten löschen Sie ~/pgsql_tmp
und lassen es mit dem Befehl ln erstellen.
Beachten Sie zunächst, dassLNverknüpft nicht zwei Objekte, sondern erstellt von einem Ort aus eine Verknüpfung zu einem Ziel mit einem bestimmten Namen.
ln [OPTION]... [-T] TARGET LINK_NAME
Wenn Sie mit einen Link erstellen ln
, sollte das Argument NAME auf ein Objekt hinweisen, das noch nicht existiert und das als Ergebnis des Befehls erstellt wird. In Ihrem Fall haben Sie es bereits ( ~/pgsql_tmp
) als Verzeichnis erstellt.
Normalerweise können Sie mit diesem -f
Schalter das Löschen von allem erzwingen, was den Pfad von NAME bereits überlappt, aber in Ihrem Fall haben Sie angegeben, -T
dass Sie den Link als Datei und nicht als Verzeichnis erstellen möchten. Wenn also -f
das Objekt bei NAME überschrieben wird, wird versucht, ein Verzeichnis mit einer Datei zu überschreiben.
Sie können den Link also entweder als Verzeichnis erstellen und -f verwenden, oder Sie können das Objekt löschen, das NAME überlappt, und dann Ihren Link erstellen. Letzteres ist die beste Option.
#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
Antwort2
Ich weiß, dass es eine alte Frage ist, möchte aber weitere Einzelheiten hinzufügen.
Gemäß Ihrer Frage lautet Ihre Quelle = "/$PGDATA/base/pgsql_tmp" Ziel = "/mnt/pgsql_tmp"
Sie müssen am Ziel also nicht „pgsql_tmp“ angeben. Wenn Sie „ln -sf“ ausführen, wird ein neues „pgsql_tmp“ erstellt oder, falls es bereits existiert, einfach mit der Quelle verknüpft. Ihr Befehl sollte also wie folgt lauten.
ln -sf /$PGDATA/base/pgsql_tmp /mnt/
Der oben genannte Fall liegt vor, wenn Sie einen Ziellink mit dem gleichen Namen wie die Quelle haben möchten, z. B. „pgsql_tmp“ auf der Quelle und der gleiche Name auf dem Ziel. Wenn der Name des Zielverzeichnisses anders ist, verwenden Sie den Schalter T wie unten.
ln -sfT /$PGDATA/base/pgsql_tmp /mnt/neues_Verzeichnis