Проверьте, изменилась ли символическая ссылка - PullRequest
2 голосов
/ 05 июня 2010

У меня есть демон, который при запуске загружает свои данные из каталога, который является символической ссылкой. Периодически генерируются новые данные и обновляется символическая ссылка. Мне нужен bash-скрипт, который проверит, совпадает ли текущая символическая ссылка со старой (с которой запущен демон), и если нет, перезапустите демон. Моя текущая мысль:

if [[ ! -e $old_dir || $(readlink "$data_dir") == $(readlink "$old_dir") ]];
then
  echo restart
  ...
  ln "$(readlink "$data_dir")" "$old_dir" -sf
else
  echo no restart
fi

Абстрактное требование: при каждом запуске сценария необходимо проверять, указывает ли теперь символическая ссылка на заданный путь на что-то, отличное от того, что было в прошлый раз, и если да, то делать что-либо. (В качестве альтернативы можно было бы проверить, изменились ли данные в пути, но я не вижу в этом ничего более чистого.) Мои вопросы:

  • Это хороший подход?
  • У кого-нибудь есть идея получше?
  • Что я должен использовать для $old_dir, куда я должен поместить символическую ссылку?

Ответы [ 2 ]

1 голос
/ 05 июня 2010

Что касается хорошего подхода, я не уверен.Кажется, много работоспособного, но странного.

Я бы поместил old_dir в / var / local / имя проекта

РЕДАКТИРОВАТЬ: Не видя достаточно, чтобы по-настоящему понять, ведет ли вас неправильнопуть, я как-то думаю, что правильный способ сделать это - использовать каталоги спулинга.

Это работает так:

  1. Новый рабочий файл создается в / var / spool / appname/tmp.
  2. Файл перемещается в / var / spool / appname (требуется та же файловая система)
  3. Файл выбирается из / var / spool / appname, обрабатывается и удаляется (или перемещается, еслиэто более уместно)

Шаг 2 - это атомная передача обслуживания.Шаг 3, возможно, должен быть защищен, так что обработка одного и того же файла дважды безвредна.

Опять же, если у вас есть что-то вроде сохранения полной истории, а символическая ссылка ссылается на текущий, вы уже делаете это правильно.

0 голосов
/ 05 июня 2010

Ваш скрипт должен знать, каким должен быть оригинал $old_dir. Вы можете сохранить значение в файле, например, в /var/run/app_name.

Мне до сих пор не ясно, почему вы хотите это сделать. К сожалению.

Edit:

Основываясь на стандарте иерархии файловых систем, я бы сказал, что /var/lib/appname может быть подходящим местом для размещения вашей символической ссылки.

...