Файлы инициализации сеанса странные по истерическим историческим причинам.
Давным-давно вы вошли в систему на консоли, точка. Когда вы вошли в систему, у вас есть оболочка, и оболочка загружает какой-то файл инициализации. Для оболочек в стиле Борна есть два файла инициализации: / 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
Один из способов обойти эту проблему (, если каталог резервных копий находится в своем собственном разделе ), — оставить том несмонтированным, подключив его непосредственно перед запуском команды 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 уже запущен на разделе ), остальная часть команды не будет выполнена.
Решение, в чем-то похожее на решение Марка , но не требующее изменений в /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...
Несколько замечаний по этому поводу:
mkdir
— атомарная операция, очень похожая на mount
, которая завершится ошибкой, если каталог уже существует, но создаст каталог, если его нет. Это безопаснее, чем сначала проверять блокировку файла , а затем создавать его (в два этапа с возможностью состояния гонки в -между ).
Ловушка EXIT
гарантирует, что каталог блокировки будет удален при завершении сценария. Каталог блокировки также будет удален при перезагрузке (системой ), поскольку он находится в /tmp
.
Я установил PATH
в соответствующее значение, а не вызывал rsync
с его полным путем. Это чисто косметическая вещь, но она может быть полезна, если позже скрипт будет расширен для использования других команд из набора портов OpenBSD (, таких как restic
илиborgbackup
).
Опция -z
для rsync
необходима только при очень медленных сетевых подключениях (, когда сжатие/распаковка данных выполняется быстрее, чем пропускная способность сети ), и никогда для локального копирования. Я также предпочитаю-i
(--itemize-changes
)вместо -v
(--verbose
), так как это точно скажет мне, почему файл был передан.
Для безопасного резервного копирования больших объемов данных я обычно рекомендую использовать специально написанное программное обеспечение для резервного копирования поверх rsync
, напримерrestic
илиborgbackup
. Эти два дополнительно выполняют дедупликацию и шифрование данных, а borgbackup
может дополнительно выполнять сжатие. restic
хорош в том смысле, что позволяет сохранять резервные копии на внешний сервер (поверх, например. sftp
), даже если на этом сервере не установлено restic
, тогда как borgbackup
требует, чтобы программное обеспечение было установлено в целевой системе. И restic
, и borgbackup
управляют блокировкой хранилища резервных копий.