Ich versuche (so nah wie möglich) einen Symlink atomar zu ändern. Ich habe es versucht:
ln -sf other_dir existing_symlink
Dadurch wurde der neue Symlink in das Verzeichnis gestellt, auf das existing_symlink zeigte.
ln -sf other_dir new_symlink
mv -f new_symlink existing_symlink
Das hat das Gleiche bewirkt: Der Symlink wurde in das Verzeichnis verschoben.
cp -s other_dir existing_symlink
Es lehnt ab, weil es ein Verzeichnis ist.
Ich habe gelesen, dass mv -T
es dafür gemacht wurde, aber busybox hat die -T
Flagge nicht.
ln -snf
) zu tun , aber es gibt immer noch zwei Systemaufrufe unter der Haube.Dies kann in der Tat atomar erfolgen
rename(2)
, indem zuerst der neue Symlink unter einem temporären Namen erstellt und dann der alte Symlink auf einmal sauber überschrieben wird. Wie die Manpage sagt:In der Shell würden Sie dies
mv -T
folgendermaßen tun :Sie können
strace
diesen letzten Befehl ausführen, um sicherzustellen, dass er tatsächlichrename(2)
unter der Haube verwendet wird:Beachten Sie, dass in den obigen Abschnitten beide
mv -T
undstrace
Linux-spezifisch sind.Verwenden Sie unter FreeBSD
mv -h
alternativ.quelle
rename
Syscall direkt anstelle vonmv -h
oder zu verwendenmv -T
. Zum Beispiel mit Perl:perl -e 'rename "z.new", "z" or die $!'
An der Stelle, an der Arto hier aufgehört hat, ist dies durchaus möglich, auch ohne
mv -T
, Sie müssen lediglich einen neuen Symlink mit demselben Namen wie das Zielverzeichnis erstellen undmv
in das übergeordnete Verzeichnis Ihres Ziels kopieren:Codebeispiel aufgenommen über ( http://axialcorps.wordpress.com/2013/07/03/atomically-replacing-files-and-directories/ )
quelle
Hast du es versucht
ln -snf
?Die Option
-n
überschreibt das Ziel, anstatt darunter zu schreiben, wenn das Ziel eine symbolische Verknüpfung zu einem Verzeichnis ist.Prost
quelle
ln -snf
ist nicht atomar: Es hebt die Verknüpfung zum Ziel auf und erstellt dann den gewünschten Symlink.