У меня есть файл конфигурации config_file
который хранится на сетевом монтировании NFSv3, и я хотел бы безопасно обновить этот файл.
Вот условия и ограничения, в которых я работаю:
config_file
доступен для клиентов, которые хотят его прочитатьconfig_file
обновлен немедленно. Подождите минуту или две, пока обновятся кеши, это нормально, если соблюдаются ограничения №1 и №2.Реализации NFSv3 на обоих концах - RHEL (Red Hat Enterprise Linux).
Вот что я до сих пор придумал:
Клиентские приложения читают из /mount/path/config_file
, что на самом деле является символической ссылкой на /mount/path/config_file_current
Позволять:
NEW = Path to the new configuration file that I'm try to install ( /path/to/my/workspace/config_file )
SYM = The path to the symlink ( /mount/path/config_file )
CURRENT = The path to the current version of config_file ( /mount/path/config_file_current )
TMP = The path to a temporary version of config_file ( /mount/path/config_file_tmp )
cp ${NEW} ${TMP} # Initial copy of the new configuration file over the temporary file
ln -f ${TMP} ${SYM} # Point the symlink to the temporary file [1]
rm ${CURRENT} # To prevent torn reads, delete the previous file so that the file handle is "stale"
cp ${TMP} ${CURRENT} # Copy the newest version of config_file back to ${CURRENT}
ln -f ${CURENT} ${SYM} # Point the symlink back to ${CURRENT}
[1] Symlink
создание - одна из двух операций NFSv3, которые определены как атомарные в RFC 1813 (файл спецификации NFSv3)
Эта процедура должна быть безопасной в системе RHEL, работающей в локальной файловой системе, но не во всех без исключения реализациях NFSv3, потому что клиент может попытаться прочитать из устаревшего дескриптора файла.
Мой вопрос к сообществу Server Fault таков: безопасна ли эта процедура для реализации NFSv3, когда и клиент, и сервер работают с RHEL?
Я основываю это на двух статьях:
https://utcc.utoronto.ca/~cks/space/blog/sysadmin/SafelyUpdatingUnixFiles
https://utcc.utoronto.ca/~cks/space/blog/sysadmin/SafelyUpdatingNFSFiles
Мне кажется, что вы делаете это сложнее / сложнее, чем нужно. Вы, по-видимому, занимаетесь именованием, что, с моей точки зрения как системного администратора, уже 40 лет, не только ненужно, но и мешает вам отслеживать некоторую потенциально полезную информацию, хотя у вас может быть другой способ сделайте отслеживание.
В частности, это было бы проще:
ConfigDir=/some/path/for/new/and/old/config_files
NewFile=${ConfigDir}/<file_basename>.yyyymmddhhmmss # Tracking, here by timestamp
cp ${NEW} ${NewFile} # Save the new config file where you're going to link to it
ln -f ${NewFile} ${SYM} # Point the symlink to the new configuration file
# The following is only necessary if you need to hurry along finding the new config
rm ${CURRENT} # To prevent torn reads, delete the previous file so that the file handle is "stale"
CURRENT=${NewFile}
Я не знаю, используете ли вы это в циклической структуре или что-то в этом роде, поэтому, возможно, вам нужно установить CURRENT и / или NewFile по-другому, но я думаю, вы уловите идею. ... Старая поговорка - это мудрость: «ПОЦЕЛУЙ! - Будь простым, глупый!» Это почти никогда не бывает плохим советом.