Я пытаюсь (как можно ближе) атомно изменить символическую ссылку. Я пробовал:
ln -sf other_dir existing_symlink
Это просто поместит новую символическую ссылку в каталог, на который указывает существующая_симлинк.
ln -sf other_dir new_symlink
mv -f new_symlink existing_symlink
Это сделало то же самое: оно переместило символическую ссылку в каталог.
cp -s other_dir existing_symlink
Он отказывается, потому что это каталог.
Я читал, что mv -T
это было сделано для этого, но у busybox нет -T
флага.
ln -snf
), но под капотом все еще есть два системных вызова.Это может действительно быть сделано атомарно с
rename(2)
, сначала создать новую символическую ссылку под временным именем , а затем аккуратно перезаписывать старый симлинк на одном дыхании. Как говорится на странице руководства :В оболочке вы можете сделать это
mv -T
следующим образом:Вы можете использовать
strace
эту последнюю команду, чтобы убедиться, что она действительно используетсяrename(2)
под капотом:Обратите внимание, что в приведенном выше, оба
mv -T
иstrace
являются специфичными для Linux.На FreeBSD используйте
mv -h
поочередно.источник
rename
системный вызов напрямую вместоmv -h
илиmv -T
. Например с Perl:perl -e 'rename "z.new", "z" or die $!'
Подобрать, где остановился Arto, это вполне возможно, даже без этого
mv -T
, вам просто нужно создать новую символическую ссылку с тем же именем, что и целевой каталог, иmv
поместить его в родительский каталог вашей цели:Пример кода взят через ( http://axialcorps.wordpress.com/2013/07/03/atomically-replacing-files-and-directories/ )
источник
Ты пробовал
ln -snf
?Опция
-n
перезаписывает место назначения, а не записывает под ним, когда место назначения является символической ссылкой на каталог.ура
источник
ln -snf
не является атомарным: он отменяет связь с адресатом, а затем создает желаемую символическую ссылку.