![]() |
Virtualbox Backup задание в планировщике
Понадобилось делать еженочный бэкап виртуальных жёстких дисков виртуалбокса с особенностями:
0. скрипт должен останавливать виртуальные машину 1. скрипт будет создавать папку по указанному пути с сегодняшней датой, формата "дд_мм_гггг" 2. в эту папку он будет копировать диски виртуальных машин и сжимать их 7z 3. после окончания копирования запускать виртуальную машину 4. проверить количество папок, если их больше 7 - удалять самы 4. писать txt лог в этой же папке всего что он сделал или не сделал. У виртуалбокса есть утилита в папке с установленной программой, vboxmanage.exe Если cmd через команду "cd"(или другим неведомым мне способом) установить путь, где лежит она, ей можно пользоваться используя её аргументы. Я вижу скрипт, который нужно запихнуть в планировщик заданий windows следующим: (жирные слова - то что сделать не удалось) Скрытый текст
//начало скрипта cd "C:\Program Files\Oracle VirtualBox" //переходит в каталог с утилитой виртуалбокса vboxmanage controlvm "виртуалка1" savestate> //эта команда сохраняет текущее состояние и выключает виртуалку. Используется именно этот вариант, т.к. не всегда перезагрузка желательна. выглядит так, проценты идут в процессе сохранения:
![]() ping -n 6 127.0.0.1 >nul //на случай если слегка подвиснет при сохранении состояния. возможно есть команда ожидания конца операции, но т.к. это vboxmanage, bat это отследить вряд ли сможет. vboxmanage controlvm "виртуалка2" savestate> ping -n 6 127.0.0.1 >nul vboxmanage controlvm "виртуалка3" savestate> ping -n 6 127.0.0.1 >nul создание папки с именем-датой по пути D:\vmbackup\ VBoxManage clonemedium "исходный_путь_виртдиска\диск1.vdi" "D:\vmbackup\папка_с_датой\диск1.vdi" ожидание, пока не закончится операция. операция выглядит так, проценты идут в процессе клонирования
![]() аналогично для других виртдисков(важно отметить, их количество может меняться) vboxmanage startvm "виртуалка1" --type headless //запускает виртуалку в фоновом режиме выглядит так, ждёт пока запустится и выдаёт сообщение successfully started:
![]() ping -n 6 127.0.0.1 >nul аналогично для других виртуалок проверка скриптом количества папок и, если больше 7ми, удалять самые старые по дате архивация скопированных виртдисков(с удалением копии, с которой делался архив. Чтобы остались только архивы) //конец скрипта возможно имеет смысл выключить одну-сделать операции-включить и перейти на следующую виртуальную машину но т.к. ночь, времени много, отключать все их разом или по-очереди разницы нет. так же, клонировать диск нужно именно программой виртуалбокса, т.к. она создаёт для него уникальный номер в процессе клонирования, что позволит избежать возможные проблемы в будущем при восстановлении из бэкапа. возможно, скрипт можно сделать значительно проще. |
Цитата:
|
Цитата:
Код:
cd /d "D:\vmbackup" Цитата:
Цитата:
Код:
for /f "skip=7 delims=" %%a in ('dir /ad/b/o-d/tc "papka"') do >nul 2>&1 rd /s /q "%%a" Цитата:
|
Цитата:
Цитата:
а если нет - идти дальше по скрипту, оформив это в логе |
Цитата:
Код:
for /f "delims=" %%a in ('"VBoxManage clonemedium "исходный_путь_виртдиска\диск1.vdi" "D:\vmbackup\папка_с_датой\диск1.vdi""') do echo "%%a">>"log.txt" Пути живые поставьте для проверки. |
Цитата:
Цитата:
|
Цитата:
происходит просто пауза, пока не закончится операция с предыдущей, таким образом тайм ауты и пинги не нужны более того, VBoxManage.exe сам может создавать папку если её нет, таким образом cmdшная команда тоже тут не нужна. Код:
cd /d "D:\vmbackup" Код:
"C:\Program Files\Oracle VirtualBox\vboxmanage.exe" controlvm "имя_виртуалки" savestate не сработал
![]() он же, из этой же папки запущенный
![]() так же, уважаемый товарищ alpap, это, я так понимаю, запись в лог? Код:
for /f "delims=" %%a in ('"VBoxManage clonemedium "исходный_путь_виртдиска\диск1.vdi" "D:\vmbackup\папка_с_датой\диск1.vdi""') do echo "%%a">>"log.txt" |
Цитата:
Код:
pushd "papka" Цитата:
|
на данный момент выглядит так:
Код:
# сохранение состояния вирт машины и её выключение и есть ли возможность из планировщика запускать его в фоне? (чтобы окно cmd не открывылось) |
Цитата:
Код:
for %%a in ("Эта строка будет записана в файл "log.txt"") do echo %%~a>"log.txt" Код:
@echo on Цитата:
Код:
WScript.CreateObject("WScript.Shell").Run """%comspec%"" /c """ & WScript.Arguments.Item(0) & """", 0, False а в планировщике указать запуск файла "file.vbs" (путь к нему) и добавить запуск с параметром и указать путь к "name.bat" |
не совсем понял в этом коде,
Код:
@echo on |
zegordo,
ууу, как все запущено , у меня просто наводящий пример, не более:) давайте сюда ваш полный рабочий код и напишите какую информацию из него надо получить в лог, но привязавшись к командам, в коде которые ее выдают например, в строке: VBoxManage clonemedium... неизвестно можно ли получить вывод в лог что-то кроме строки команды лишь в подобной строке: ping -n 6 127.0.0.1 если не зануляя вывод можно получить, но нужен ли он, здесь важно прошел пинг или нет, зачем вам TTL=... или кол-во мс я же не могу и думать за вас, вы сами должны определить что вы хотите анализировать как вы хотите это сделать (примерно) как хотите видеть. для начала выложите полный рабочий код, я посмотрю и скажу что можно (желательно) вывести в лог и покажу как сделать. |
на данный момент рабочий код (пути команд тестовые(но рабочие), потому и диск везде один)
Код:
# сохранение состояния вирт машины и её выключение сохранение состояния вирт машины с её выключением
![]() клонирование диска
![]() запуск вирт машины
![]() команда удаления диска из вирт носителей ничего не пишет, но там это и не нужно. собственно, всю информацию на скринах выше (включая % и сами команды) и нужно получить в логе, включая итог очистки папок(какие удалились). команды ошибок операций vboxmanage.exe инициировать просто не получится, но выглядят они ровно таким же текстом, как на скринах выше. |
например:
Код:
@echo off |
большое спасибо!
всё работает, заменить пути в переменные это интересный подход чтобы писал в папку с датой лог, добавил создание папки из вашего поста ранее + добавил переменную клона диска, чтобы не было путаницы. Код:
@echo off проценты остаются в cmd окне
![]() а сам лог содержит только текст Код:
Clone medium created in format 'VDI'. UUID: f1b31377-47f0-40bb-b5f8-6145c11977e5 |
Код:
... Вообще с учетом что вы заходите в папку код можно так переписать: Код:
@echo off |
Цитата:
Цитата:
те же проценты в cmd окне и та же инфа в логе Код:
Clone medium created in format 'VDI'. UUID: b24af47a-68af-4e18-9363-e64c32d622f4 |
zegordo,
ладно сделаем в лоб Код:
@echo off Цитата:
а вообще (мне лично) стремно было бы держать папку с логом ((%date%), а могла бы быть и очень важная информация) в папке, в которой же происходит удаление папок или же держал просто файлом тоже с именем %date% или вообще не в этой папке. |
zegordo, alpap, статус:
Код:
0%...10%...20%...30%...40%...50%...60%...70%...80%...90%...100% Цитата:
|
Iska,
спасибо, до меня уже позже дошло, опередили. пока это исключено вообще из логгирования, посмотрим на ответ ТС |
Цитата:
так же, возможно в будущем будет другой скрипт, который будет проверять логи на ошибки - удалять папки без ошибок, а по ошибкам оповещать, тут вариантов несколько есть и это надо будет хорошо продумать, но это уже второй вопрос. что касается скрипта, через 2>&1 действительно работает! вот что пишется в лог файле: Код:
сохранение состояния и выключение вирт. машины а ниже, если в 1251 Код:
б®еа**Ґ*ЁҐ б®бв®п*Ёп Ё ўлЄ«озҐ*ЁҐ ўЁав. ¬*иЁ*л ну и рабочий код: Код:
@echo off всем спасибо, вопрос считаю решённым возможно, кому-то из гугла это решение поможет, т.к. я в чистом поиске такого решения не нашёл, почему и обратился сюда. |
alpap, скажите пожалуйста, как после кода
Код:
@echo off Код:
for /f "skip=7 delims=" %%a in ('dir /ad/b/o-d/tc') do @echo %%a& rd /s /q "%%a" 1. файлов в любых путях 2. папок в любых путях |
Цитата:
а логгирование ..., просто оберните нужный код с предусмотренным выводом чего нужно в лог и все папки Код:
@echo off Код:
@echo off @echo [%date%_%time%] следующие папки удалены с содержимым: |
Время: 23:25. |
Время: 23:25.
© OSzone.net 2001-