Автоматизация на скриптах: делаем умный бэкап

Автоматизация на скриптах: делаем умный бэкап

Сложная статья для тех, кто хочет сохранить важные данные

Сегодня будет забористая практика по автоматизации и скриптам, для которой понадобятся все наши предыдущие статьи на эту тему:

Даже если вам не нужны сейчас резервные копии и вы не собираетесь заниматься ими в ближайшее время, то просто посмотрите, как вообще можно управлять своим компьютером и что в нём можно запрограммировать самому.

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

Скрипт записывается в файл и потом исполняется. Исполнить скрипт можно по требованию пользователя или по расписанию. 

Большинство скриптов и настроек для их запуска делается в системах, основанных на Linux и UNIX. Всё дело в том, в этих операционных системах на первом месте стоит командная строка и управление текстовыми командами через терминал. В буквальном смысле эти операционки управляются текстом и выдают текст. 

Графическая оболочка подобных систем — это надстройка над ядром: по сути все эти кнопочки, иконки, стрелочки и поля ввода — это удобный способ давать компьютеру те же самые текстовые команды. Обычным пользователям нужны эти кнопочки, чтобы было интуитивно понятно, куда нажимать; но компьютеру они не нужны — внутри себя он оперирует текстовыми командами. 

Это мы говорили про операционные системы семейства Linux, UNIX-подобные системы и Mac OS. 

А вот Windows сразу проектировали так, что графический интерфейс был главным, а все консольные дела спрятали подальше. У них до сих пор неудобный интерфейс, в котором сложно разобраться, но часто это единственный способ настроить компьютер нужным образом.

Поэтому мы сначала расскажем, как сделать автоматизацию на Mac OS, а потом поговорим про Windows.

Что делаем

В последней статье про автобэкап мы остановились на том, что запускали команды по расписанию каждые 10 секунд. Это рабочий вариант, но можно сделать гораздо круче:

  1. Учим компьютер определять момент, когда вставляется флешка или подключается внешний жёсткий диск.
  2. Проверяем, та ли это флешка, которая нужна для бэкапа.
  3. Если та — выводим сообщение о начале резервного копирования.
  4. Ждём, пока всё скопируется.
  5. Выводим сообщение, что всё готово.

С таким подходом компьютер не будет пытаться сделать копии каждые 10 секунд, а дождётся нужного носителя и сообщит нам, когда копирование закончится.

Чтобы сделать всё это, нам понадобится два инструмента — launchctl для отслеживания подключённых устройств и скрипт, который будет отвечать за резервное копирование.

Если у вас Linux, то вместо launchctl вам понадобится systemd и udev, в которые нужно будет добавить правила обработки событий и запуска скрипта. Про это мы поговорим в другой раз.

Настраиваем компьютер

В Mac OS есть специальная программа, которая запускает разные службы и следит за их выполнением. Наша задача — написать службу, которая в момент подключения внешнего диска запустит нужный скрипт. 

Служба — это просто файл с расширением .plist, который лежит в определённой папке. Чтобы его создать и открыть для редактирования, выполним в терминале такие команды:

touch ~/Library/LaunchAgents/com.simple.backup.StartOnMount.plist

open -e ~/Library/LaunchAgents/com.simple.backup.StartOnMount.plist

Первая команда создаёт новый файл, если его ещё не было, а вторая — открывает его в текстовом редакторе. Название файла можно сделать любым, в нашем случае мы просто сделали его по правилам Apple, когда оно должно состоять из домена, названия компании и прочих параметров.

Теперь вставим в пустой файл команды для службы и сохраним его:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>Label</key>
<string>com.simple.backup</string>
<key>ProgramArguments</key>
<array>
<string>/Users/mike/Scripts/backup.sh</string>
</array>
<key>StartOnMount</key>
<true/>
</dict>
</plist>
Автоматизация на скриптах: делаем умный бэкап
Служба — это просто текстовый файл, который можно сделать самому и отредактировать как угодно

Теперь посмотрим, из чего состоит этот файл. В самом начале идёт стандартное описание, которое есть у всех служб:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">

После него идёт раздел с названием службы  — оно нам пригодится, когда будем проверять, запущена она или нет. В нашем случае название такое — com.simple.backup:

<key>Label</key>
<string>com.simple.backup</string>

Следующий параметр отвечает за команду, которую должна выполнить служба. У нас это будет скрипт backup.sh, который мы напишем чуть позже:

<key>ProgramArguments</key>
<array>
<string>/Users/mike/Scripts/backup.sh</string>
</array>

И последнее, но самое важное: говорим службе, что команду нужно выполнить только тогда, когда в компьютер добавится новое внешнее устройство — флешка или жёсткий диск:

<key>StartOnMount</key>
<true/>

Теперь, когда файл со службой готов, нам остаётся запустить его такой командой:

launchctl load -w ~/Library/LaunchAgents/com.simple.backup.StartOnMount.plist

Если нужно будет что-то поправить в службе, то перед этим её нужно остановить, а потом запустить заново:

launchctl unload -w ~/Library/LaunchAgents/com.simple.backup.StartOnMount.plist

Чтобы убедиться, что служба запущена и работает, наберём в консоли такое:

launchctl list | grep backup

Автоматизация на скриптах: делаем умный бэкап
Этой командой launchctl list выводит список всех запущенных служб, а grep backup фильтрует только те, где в названии есть слово backup

Служба готова, осталось написать скрипт.

Пишем скрипт

Скрипт — это просто последовательность команд для компьютера, которую сохранили в один файл. Когда мы делали службу, то указали путь к файлу со скриптом — /Users/mike/Scripts/backup.sh. Чтобы служба могла его запустить, создадим этот файл и вставим туда такие команды из текста ниже.

При старте этот скрипт проверит, вставлена ли нужная флешка, и если да — сделает резервные копии нужных нам папок. Получается, что он не будет пытаться сделать это всё время, а сработает только при подключении нового устройства.

# если подключена нужная флешка, которая называется BACKUP
if [[ $(mount | awk '$3 == "/Volumes/BACKUP" {print $3}') != "" ]];
then
    # выводим системное сообщение 
    osascript -e 'Display notification with title "Приступаю к резервному копированию"'

    # запускаем резервное копирование — сначала картинки, потом документы
    rsync -av /Users/mike/Pictures /Volumes/Backup/bp-pictures
    rsync -av /Users/mike/Documents /Volumes/Backup/bp-docs
    # сообщаем, что всё готово
    osascript -e 'Display notification with title "Резервное копирование завершено"'
fi

Даём разрешение на запуск

В новых версиях Mac OS следит за тем, как программы работают с диском, и по умолчанию запрещает всем с ним работать. Чтобы наш скрипт мог работать с файлами и папками, нужно зайти в Системные настройки → Защита и безопасность → Доступ к диску, там нажать на плюсик. Когда откроется окно выбора папки, нажимаем  ⇧+⌘+G, вставляем туда /bin/bash и выбираем в этой папке команду bash. Теперь наш скрипт может делать на диске всё, что ему нужно. 

Автоматизация на скриптах: делаем умный бэкап
Автоматизация на скриптах: делаем умный бэкап
Автоматизация на скриптах: делаем умный бэкап

Проверяем работу

Чтобы убедиться, что скрипт работает, вставим флешку, которая называется BACKUP. Сразу появляется уведомление, что резервное копирование началось, а на флешке появляются нужные файлы:

Автоматизация на скриптах: делаем умный бэкап

А как это сделать на Windows?

Чтобы сделать всё точно так же — со службами, сервисами, скриптами и загрузкой в память, нужно открыть 8 разных панелей настроек и оснасток и в каждой прописать свои команды и параметры. Это сложно, долго и срабатывает не с первого раза. Дело в том, что в Windows делали упор на использование компьютера новичками, которым проще управлять окнами мышкой, чем вводить команды с консоли. В итоге то, что можно сделать парой скриптов, приходится долго собирать по разным частям системы. Поэтому на Windows проще найти бесплатную программу, которая сделает всё сама, чем настраивать всё вручную.

Но однажды мы доберёмся и до того, как сделать такой же автоматический бэкап штатными средствами Windows. 

Автоматизация на скриптах: делаем умный бэкап

Текст:

Михаил Полянин

Редактор:

Максим Ильяхов

Художник:

Даня Берковский

Корректор:

Ирина Михеева

Вёрстка:

Кирилл Климентьев

Соцсети:

Виталий Вебер

Получите ИТ-профессию
В «Яндекс Практикуме» можно стать разработчиком, тестировщиком, аналитиком и менеджером цифровых продуктов. Первая часть обучения всегда бесплатная, чтобы попробовать и найти то, что вам по душе. Дальше — программы трудоустройства.
Начать карьеру в ИТ
Получите ИТ-профессию Получите ИТ-профессию Получите ИТ-профессию Получите ИТ-профессию
Еще по теме
Что такое куки

8 вопросов, которые вы всегда хотели задать, но боялись куки.

easy
Как Яндекс пережил самую крупную DDoS-атаку в истории интернета
Как Яндекс пережил самую крупную DDoS-атаку в истории интернета

Конспект подкаста «Запуск завтра»

easy
Оптимизация кода
Оптимизация кода

Какая бывает и зачем нужна.

easy
Selectel: как работает российский провайдер инфраструктуры и облаков
Selectel: как работает российский провайдер инфраструктуры и облаков

Чем занимается инфраструктурный провайдер, можно ли в него устроиться и как там с импортозамещением

easy
«Программисты, которые умеют писать алгоритмы, — нишевая профессия»
«Программисты, которые умеют писать алгоритмы, — нишевая профессия»

Мнение работодателя Коли Митина.

easy
Настраиваем сервер для своего облачного хранилища
Настраиваем сервер для своего облачного хранилища

Готовимся к переезду в личное облако

hard
Зеро-код: это как?
Зеро-код: это как?

Какие задачи можно решать, не открывая редактор кода.

easy
Что происходит, когда мы открываем сайт в браузере
Что происходит, когда мы открываем сайт в браузере

Пошаговый рассказ о том, что делает браузер.

medium
ColdFusion — редкий и важный язык программирования
ColdFusion — редкий и важный язык программирования

Один из первых серверных языков, который смог найти себе место в современном мире.

easy
Что такое легаси в коде
Что такое легаси в коде

Однажды, Симба, всё это будет твоим

easy
hard