Стоп RSYNC Запланированная задача Состояние гонки (большой каталог, небольшой интервал времени)

Файлы инициализации сеанса странные по истерическим историческим причинам.

Давным-давно вы вошли в систему на консоли, точка. Когда вы вошли в систему, у вас есть оболочка, и оболочка загружает какой-то файл инициализации. Для оболочек в стиле Борна есть два файла инициализации: / etc / profile (для всех пользователей) и ~ / .profile (для каждого пользователя). Файл инициализации может устанавливать переменные среды, такие как PATH , загружать приложения, которые вы хотите запускать в каждом сеансе (например, индикатор почты) и т. Д. Если оболочка не является оболочкой входа ], ему не нужно ничего запускать или устанавливать переменные среды, поэтому нет необходимости запускать какой-либо файл инициализации. Конечно, нет…

На самом деле оболочки постепенно приобретали интерактивные возможности, поэтому для интерактивных оболочек необходим файл инициализации. Ksh имеет ~ / .kshrc , bash имеет ~ / .bashrc , zsh имеет ~ / .zshrc .

Удаленный интерактивный вход в систему выполняется / etc / profile и ~ /.профиль . Но они не подходят для неинтерактивного входа в систему, поскольку могут запускать неинтерактивные программы. К сожалению, не появилось стандарта для файла инициализации для неинтерактивных входов в систему.

Вы можете запустить / etc / profile и ~ / .profile вручную, если вы уверены, что они не будут производить никакого вывода или запускать какую-либо программу, просто установите переменные среды.

ssh foo '. /etc/profile; . ~/.profile; somecommand'

Если у вас есть части в вашем .profile , которые имеют смысл только в интерактивном сеансе, вы можете поместить их в условную инструкцию.

## (in ~/.profile)
case $- in
  *i*) # the shell is interactive
    newmail;;
esac

Если ваша оболочка входа в систему - bash, вы можете воспользоваться причудой: файл инициализации ~ / .bashrc читается интерактивными оболочками, а также неинтерактивными оболочками, родительский процесс которых называется rshd или sshd . В других оболочках такой особенности нет.

## (in ~/.bashrc)
case $- in
  *i*) # interactive shell: set prompt, completion settings, key bindings, etc.
    …;;
  *) # non-interactive shell: our parent must be rshd or sshd
    . ~/.profile;;
esac

1
21.08.2018, 00:30
2 ответа

Один из способов обойти эту проблему (, если каталог резервных копий находится в своем собственном разделе ), — оставить том несмонтированным, подключив его непосредственно перед запуском команды rsync. Это устраняет необходимость использования flockи может способствовать увеличению срока службы привода/снижению энергопотребления.

/etc/fstab:добавить параметр noautoв раздел, чтобы он не монтировался автоматически при загрузке

В запланированном задании daily.localили cron.daily:

#!/bin/sh
mount /mnt/media_backup && \
/usr/local/bin/rsync -avz /mnt/media_primary/ /mnt/media_backup/ && \
umount /mnt/media_backup

Оператор двойного амперсанда(&&)запускает следующую команду, только если предыдущая команда выполнена успешно. Следовательно, если резервный диск не может быть смонтирован (, потому что он уже смонтирован и rsync уже запущен на разделе ), остальная часть команды не будет выполнена.

1
27.01.2020, 23:23

Решение, в чем-то похожее на решение Марка , но не требующее изменений в /etc/fstabили монтирования и размонтирования файловых систем:

#!/bin/sh

lockdir=/tmp/file-copy.lock

if ! mkdir "$lockdir"; then
   echo 'File copy already in progress' >&2
   exit 1
fi

trap 'rmdir "$lockdir"' EXIT

PATH=$PATH:/usr/local/bin

rsync -ai...

Несколько замечаний по этому поводу:

  1. mkdir— атомарная операция, очень похожая на mount, которая завершится ошибкой, если каталог уже существует, но создаст каталог, если его нет. Это безопаснее, чем сначала проверять блокировку файла , а затем создавать его (в два этапа с возможностью состояния гонки в -между ).

  2. Ловушка EXITгарантирует, что каталог блокировки будет удален при завершении сценария. Каталог блокировки также будет удален при перезагрузке (системой ), поскольку он находится в /tmp.

  3. Я установил PATHв соответствующее значение, а не вызывал rsyncс его полным путем. Это чисто косметическая вещь, но она может быть полезна, если позже скрипт будет расширен для использования других команд из набора портов OpenBSD (, таких как resticилиborgbackup).

  4. Опция -zдля rsyncнеобходима только при очень медленных сетевых подключениях (, когда сжатие/распаковка данных выполняется быстрее, чем пропускная способность сети ), и никогда для локального копирования. Я также предпочитаю-i(--itemize-changes)вместо -v(--verbose), так как это точно скажет мне, почему файл был передан.

Для безопасного резервного копирования больших объемов данных я обычно рекомендую использовать специально написанное программное обеспечение для резервного копирования поверх rsync, напримерresticилиborgbackup. Эти два дополнительно выполняют дедупликацию и шифрование данных, а borgbackupможет дополнительно выполнять сжатие. resticхорош в том смысле, что позволяет сохранять резервные копии на внешний сервер (поверх, например. sftp), даже если на этом сервере не установлено restic, тогда как borgbackupтребует, чтобы программное обеспечение было установлено в целевой системе. И restic, и borgbackupуправляют блокировкой хранилища резервных копий.

3
27.01.2020, 23:23

Теги

Похожие вопросы