-2

Скрипт с именем /root/backup.sh на w01, который будет резервировать содержимое /home

Скрипт будет:

  • Создайте архив tar с именем /share/<YYYY><MM><DD>_w01.tar где
    • ГГГГ представляет текущий год (т.е. 2014)
    • ММ представляет текущий месяц (т.е. 11)
    • ДД представляет текущий день месяца (т.е. 22)
  • Зарегистрируйте успех и ошибки в /tmp/backup.log
  • Выйти с ненулевым кодом возврата, если возникла ошибка

2 ответа2

4

Основными факторами, которые вам понадобятся для создания сценария, будут следующие (я бы порекомендовал вам написать каждый из них как отдельный фрагмент кода, протестировать его, а затем собрать все вместе, как только вы будете довольны):

  • Наименование файла (т. Е. С использованием текущей даты в имени вашего tarball):
    Как указано в другом ответе, man date окажет вам некоторую помощь, сосредоточившись на разделе формата (например, date +%Y%m ...)

  • Ведение журнала (т.е. сохранение вывода tar в файл, к которому вы можете обратиться позже):
    Первое, что вам нужно решить, - это как долго сохранять журнал, хотите ли вы попытки предыдущего дня или просто самые последние? Если вы экономите несколько дней, вам нужно будет указывать метку даты в начале каждого нового цикла, чтобы вы могли видеть, где заканчивается один и начинается следующий.

    • echo "here's a command" > /tmp/backup.log перезапишет содержимое /tmp/backup.log и поместит вместо него строку "heres a command".
    • echo "here's a command" >> /tmp/backup.log сохранит все существующие данные в /tmp/backup.log и добавит в конце "heres a command".
    • tar -cvf /share/foo.tar /home > /tmp/backup.log поместит в журнал только STDOUT (то есть обычный вывод "Я сменил эти файлы"), но любые ошибки не будут зафиксированы.
    • tar -cvf /share/foo.tar /home 2> /tmp/backup.log поместит в журнал только STDERR (т.е. только ошибки).
    • tar -cvf /share/foo.tar /home > /tmp/backup.log 2>&1 поместит в журнал STDOUT и STDERR.

    Объедините их, чтобы создать точно правильный набор данных в вашем журнале.

  • Обработка ошибок (т.е. что делать, если tar возвращает ошибку:
    Быстрый и грязный способ реагировать на ошибки в команде - просто добавить || command_to_run_if_error после вашей команды. По сути, это говорит:«Выполнять эти команды по порядку, пока не получится», вы также можете использовать && command_to_run_if_success что похоже на выражение «Запускать эти команды по порядку, пока не произойдет сбой».

    • command1 || command2 command1 и в случае неудачи (ненулевой код выхода) запустит command2. Если это удастся, команда2 не будет запущена.
    • command1 && command2 command1 и в случае сбоя остановит и не запустит command2. Если команда command1 выполнена успешно, только тогда будет запущена команда command2.
    • Более полный обработчик ошибок может быть создан с использованием if .. then .. else .. fi

    например
    echo "About to run command1" >> logfile.log
    if command1 >> logfile.log
    then
    echo "All went well" >> logfile.log
    else
    echo "Something went wrong! ABORTING" >> logfile.log
    run_some_cleanup_command
    exit 1
    fi

    Объедините их, чтобы научить ваш сценарий тому, что делать в каждом случае неудачи.

Некоторые другие вещи, которые нужно иметь в виду:

  • Вы хотите проверить, есть ли место на / поделиться, чтобы соответствовать вашему tarball, прежде чем вы это сделаете?
    Подумайте об использовании du -sk /home чтобы узнать, сколько КБ необходимо создать для резервного копирования, и сравните это с количеством свободного места в df -k /share . Вы можете использовать команды оболочки, такие как [ $space_on_share -lt $data_in_home ] || exit 1 чтобы прервать, а не использовать все свободное место (вы, вероятно, захотите, чтобы в нем было что-то полезное, а не просто выход).

  • Хотите сделать резервную копию всего в / дома?
    Подумайте о том, чтобы иметь список исключаемых вещей, чтобы сэкономить место или защитить конфиденциальность.

  • Рассматривали ли вы использовать сжатие для экономии места?
    некоторые версии tar принимают флаг -z для использования сжатия gzip, или вы можете указать STDOUT в качестве имени файла, а затем направить вывод через gzip (tar -cf - /home | gzip -c > /share/foo.tar.gz)

2

Ключ к запуску любой проблемы скриптинга - разбить ее на мелкие кусочки. Код и и протестируйте первые маленькие кусочки, прежде чем добавлять больше функций.

Например

шаг 1

Вы можете начать с написания скрипта, который печатает "Запуск резервного копирования" и больше ничего не делает.

шаг 2

Как только это сработает, измените его, чтобы присвоить выходные данные команды date переменной оболочки (например, $today) и распечатать содержимое этой переменной.

шаг 3

Когда шаг 2 полностью протестирован и работает, просмотрите man date и посмотрите, как изменить вывод, чтобы получить требуемый формат вывода «<YYYY> <MM> <DD>».

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

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .