Вы можете сделать что-нибудь вроде
failed=false
for task in "${tasks[@]}"; do
if ! process "$task"; then
failed=true
break
fi
commit "$task"
done
if "$failed"; then
echo "Failed something" >&2
fi
Если вам нравится tar
, за исключением временного файла, это просто: не используйте временный файл. Используйте трубу.
cd /home ; tar cf - user | gzip | ssh archivehost -l archiveuser 'cat > user.archived.tar.gz'
Замените xz
или как вам удобнее вместо gzip
. Или переместите его на другую сторону соединения, если экономия циклов ЦП на главном сервере важнее, чем экономия пропускной способности сети (и ЦП на сервере архивации)
cd /home ; tar cf - user | ssh archivehost -l archiveuser 'gzip > user.archived.tar.gz'
Вы можете вставить gpg
в там тоже. Имейте пару ключей только для этих архивов, шифруйте с помощью открытого ключа при сохранении, используйте закрытый ключ, когда вам нужно что-то восстановить.
Дополнительные подробности по запросу:
Я предполагаю, что user
будет пользователем, чей домашний каталог /home/user
вы архивируете. archivehost
— это сервер, на котором вы собираетесь хранить архивы, а archiveuser
— это учетная запись на сервере архивации, которой будут принадлежать архивы.
tar cf - user
означает «создать tar-архив пользователя
и записать его в стандартный вывод». -c
означает «создать», а -f -
— «использовать стандартный ввод/стандартный вывод в качестве файла». Это, вероятно, будет работать только с tar c пользователем
, так как -f -
, вероятно, будет значением по умолчанию, но первоначально действие по умолчанию tar
заключалось в чтении или записи ленточное устройство. Использование явного -f -
может быть просто признаком того, что я стар.
Флаг tar z
подойдет, но я не могу показать, как переместить его на другую сторону ssh
.(Кроме того, соединение gzip
и tar
с явным каналом — это одна из тех «старичковых» вещей — у tar
не всегда была такая возможность.) Плюс Я могу заменить bzip2
, lzop
, xz -3v
или любую другую программу сжатия без необходимости запоминать соответствующие параметры tar
.
Я никогда раньше не слышал о --checkpoint
, так что вам придется полагаться на собственные тесты.
Rsync — разумный выбор. Нет ничего плохого в использовании rsync для одноразовой передачи.
Tar также является разумным выбором. Вам не нужно хранить архив локально, вы можете направить его напрямую в SSH.
Другой вариант — смонтировать каталог сервера поверх SSHFS. Однако имейте в виду, что SSHFS не сохранит все метаданные, такие как разрешения. (Tar и rsync также могут не сохранять все метаданные, но они могут работать лучше — передать --acls --xattrs
в GNU tar, передать --acls --xattrs
в rsync .)