Сегодня будет забористая практика по автоматизации и скриптам, для которой понадобятся все наши предыдущие статьи на эту тему:
Даже если вам не нужны сейчас резервные копии и вы не собираетесь заниматься ими в ближайшее время, то просто посмотрите, как вообще можно управлять своим компьютером и что в нём можно запрограммировать самому.
Ключевое слово этой статьи — скрипт. Скрипт — что-то вроде киносценария: он говорит компьютеру, какие команды выполнить, что сделать с файлами и приложениями, что как обработать и в какой последовательности.
Скрипт записывается в файл и потом исполняется. Исполнить скрипт можно по требованию пользователя или по расписанию.
Большинство скриптов и настроек для их запуска делается в системах, основанных на Linux и UNIX. Всё дело в том, в этих операционных системах на первом месте стоит командная строка и управление текстовыми командами через терминал. В буквальном смысле эти операционки управляются текстом и выдают текст.
Графическая оболочка подобных систем — это надстройка над ядром: по сути все эти кнопочки, иконки, стрелочки и поля ввода — это удобный способ давать компьютеру те же самые текстовые команды. Обычным пользователям нужны эти кнопочки, чтобы было интуитивно понятно, куда нажимать; но компьютеру они не нужны — внутри себя он оперирует текстовыми командами.
Это мы говорили про операционные системы семейства Linux, UNIX-подобные системы и Mac OS.
А вот Windows сразу проектировали так, что графический интерфейс был главным, а все консольные дела спрятали подальше. У них до сих пор неудобный интерфейс, в котором сложно разобраться, но часто это единственный способ настроить компьютер нужным образом.
Поэтому мы сначала расскажем, как сделать автоматизацию на Mac OS, а потом поговорим про Windows.
Что делаем
В последней статье про автобэкап мы остановились на том, что запускали команды по расписанию каждые 10 секунд. Это рабочий вариант, но можно сделать гораздо круче:
- Учим компьютер определять момент, когда вставляется флешка или подключается внешний жёсткий диск.
- Проверяем, та ли это флешка, которая нужна для бэкапа.
- Если та — выводим сообщение о начале резервного копирования.
- Ждём, пока всё скопируется.
- Выводим сообщение, что всё готово.
С таким подходом компьютер не будет пытаться сделать копии каждые 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
Служба готова, осталось написать скрипт.
Пишем скрипт
Скрипт — это просто последовательность команд для компьютера, которую сохранили в один файл. Когда мы делали службу, то указали путь к файлу со скриптом — /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.