Имя пользователя:
Пароль:  
Помощь | Регистрация | Забыли пароль?  | Правила  

Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » Скриптовые языки администрирования Windows » CMD/BAT - [решено] Virtualbox Backup задание в планировщике

Ответить
Настройки темы
CMD/BAT - [решено] Virtualbox Backup задание в планировщике

Пользователь


Сообщения: 77
Благодарности: 0

Профиль | Отправить PM | Цитировать


Изменения
Автор: zegordo
Дата: 15-02-2017
Понадобилось делать еженочный бэкап виртуальных жёстких дисков виртуалбокса с особенностями:

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ми, удалять самые старые по дате
архивация скопированных виртдисков(с удалением копии, с которой делался архив. Чтобы остались только архивы)
//конец скрипта


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

Отправлено: 17:13, 15-02-2017

 

Ветеран


Сообщения: 27449
Благодарности: 8087

Профиль | Отправить PM | Цитировать


Цитата zegordo:
(или другим неведомым мне способом »
Указывая полный путь к ней.
Это сообщение посчитали полезным следующие участники:

Отправлено: 17:46, 15-02-2017 | #2



Для отключения данного рекламного блока вам необходимо зарегистрироваться или войти с учетной записью социальной сети.

Если же вы забыли свой пароль на форуме, то воспользуйтесь данной ссылкой для восстановления пароля.


Ветеран


Сообщения: 1274
Благодарности: 564

Профиль | Отправить PM | Цитировать


Цитата zegordo:
создание папки с именем-датой по пути D:\vmbackup\ »
Код: Выделить весь код
cd /d "D:\vmbackup"
if not exist "name_%date%" md "name_%date%"
Цитата zegordo:
ожидание, пока не закончится операция »
спорный момент, даже ожидая что процесс закончил свою работу (пропал) не даст гарантии что это так, надо это все знать очень хорошо и понимать именно самому, достаточтно просто использовать: timeout /? или проверять по имени в tasklist /? или еще как
Цитата zegordo:
проверка скриптом количества папок и, если больше 7ми, удалять самые старые по дате »
удалит все папки пропуская первые семь свежих (по дате создания)
Код: Выделить весь код
for /f "skip=7 delims=" %%a in ('dir /ad/b/o-d/tc "papka"') do >nul 2>&1 rd /s /q "%%a"
Цитата zegordo:
архивация ...»
такое уже количество информации по этой части чтобы писать такой пункт, ищите ..., шансов не найти нет.
Это сообщение посчитали полезным следующие участники:

Отправлено: 19:09, 15-02-2017 | #3


Пользователь


Сообщения: 77
Благодарности: 0

Профиль | Отправить PM | Цитировать


Цитата alpap:
такое уже количество информации по этой части чтобы писать такой пункт, ищите ..., шансов не найти нет. »
http://forum.oszone.net/thread-311492.html годится?
Цитата alpap:
спорный момент, даже ожидая что процесс закончил свою работу (пропал) не даст гарантии что это так, надо это все знать очень хорошо и понимать именно самому, достаточтно просто использовать: timeout /? или проверять по имени в tasklist /? или еще как »
а есть возможность брать в цикле через Nые промежутки времени проверку на сообщение "100%" или "created" (которое на скрине есть) и если проверка успешна, приступать к следующему пункту
а если нет - идти дальше по скрипту, оформив это в логе

Отправлено: 19:36, 15-02-2017 | #4


Ветеран


Сообщения: 1274
Благодарности: 564

Профиль | Отправить PM | Цитировать


Цитата zegordo:
а есть возможность брать в цикле ...»
а так
Код: Выделить весь код
for /f "delims=" %%a in ('"VBoxManage clonemedium "исходный_путь_виртдиска\диск1.vdi" "D:\vmbackup\папка_с_датой\диск1.vdi""') do echo "%%a">>"log.txt"
есть нужный (или вообще что-то) вывод в файл?

Пути живые поставьте для проверки.
Это сообщение посчитали полезным следующие участники:

Отправлено: 19:48, 15-02-2017 | #5


Ветеран


Сообщения: 27449
Благодарности: 8087

Профиль | Отправить PM | Цитировать


Цитата alpap:
даже ожидая что процесс закончил свою работу (пропал) не даст гарантии что это так, »
VBoxManage.exe — CUI, по другому быть не может. Другое дело, что он может не сам обработку делать, а отдавать куда-то дальше.

Цитата zegordo:
а есть возможность брать в цикле через Nые промежутки времени проверку на сообщение "100%" или "created" (которое на скрине есть) и если проверка успешна, приступать к следующему пункту »
zegordo, покажите, как именно выглядит «случай если слегка подвиснет», и что при этом происходит с последующими командами, если не использовать всякие ping/timeout.
Это сообщение посчитали полезным следующие участники:

Отправлено: 20:10, 15-02-2017 | #6


Пользователь


Сообщения: 77
Благодарности: 0

Профиль | Отправить PM | Цитировать


Цитата Iska:
и что при этом происходит с последующими командами, если не использовать всякие ping/timeout. »
отличный вопрос! затестировал
происходит просто пауза, пока не закончится операция с предыдущей, таким образом тайм ауты и пинги не нужны
более того, VBoxManage.exe сам может создавать папку если её нет, таким образом
cmdшная команда тоже тут не нужна.
Код: Выделить весь код
cd /d "D:\vmbackup"
if not exist "name_%date%" md "name_%date%"
в итоге, скрипт на остановку-копию-запуск будет таким:
Код: Выделить весь код
"C:\Program Files\Oracle VirtualBox\vboxmanage.exe" controlvm "имя_виртуалки" savestate
"C:\Program Files\Oracle VirtualBox\vboxmanage.exe" clonemedium "путь_к_виртдиску\имя_виртдиска.vdi" "путь_к_копии_виртдиска\%date%\имя_виртдиска.vdi"
"C:\Program Files\Oracle VirtualBox\vboxmanage.exe" startvm "имя_виртуалки" --type headless
//повторить для других виртуальных машин
проверка скриптом количества папок в папке "D:\vmbackup" например, и, если больше 7ми, удалять самые старые по дате
запись всех итогов(достаточно просто копии всех надписей что в окне cmd прошло) в лог в этой же %date% папке в txt
выделил удаление папок, т.к. скрипт от товарища alpap
не сработал

он же, из этой же папки запущенный

так же, уважаемый товарищ alpap, это, я так понимаю, запись в лог?
Код: Выделить весь код
for /f "delims=" %%a in ('"VBoxManage clonemedium "исходный_путь_виртдиска\диск1.vdi" "D:\vmbackup\папка_с_датой\диск1.vdi""') do echo "%%a">>"log.txt"

Отправлено: 14:32, 16-02-2017 | #7


Ветеран


Сообщения: 1274
Благодарности: 564

Профиль | Отправить PM | Цитировать


Цитата zegordo:
не сработал »
при ваших именах (на предоставленном выводе) код сохранить в кодировке 866
Код: Выделить весь код
pushd "papka"
 for /f "skip=7 delims=" %%a in ('dir /ad/b/o-d/tc') do >nul 2>&1 rd /s /q "%%a"
popd
Цитата zegordo:
это, я так понимаю, запись в лог? »
нет, это просто я так хотел проверить вывод VBoxManage - забудьте.
Это сообщение посчитали полезным следующие участники:

Отправлено: 01:39, 17-02-2017 | #8


Пользователь


Сообщения: 77
Благодарности: 0

Профиль | Отправить PM | Цитировать


на данный момент выглядит так:

Код: Выделить весь код
# сохранение состояния вирт машины и её выключение
"C:\Program Files\Oracle VirtualBox\vboxmanage.exe" controlvm "имя_вирт_машины" savestate

# клонирование диска с присваиванием ему нового uuid
"C:\Program Files\Oracle VirtualBox\vboxmanage.exe" clonemedium "C:\путь_к_исходному_вирт_диску\имя_вирт_диска.vdi" "C:\путь_к_папке_бэкапов\%date%\имя_вирт_диска2.vdi"

# запуск виртуалки в фоновом режиме
"C:\Program Files\Oracle VirtualBox\vboxmanage.exe" startvm "имя_вирт_машины" --type headless

#удаление нового жёсткого диска из менеджера виртуальных носителей (во избежание огромного количества неиспользуемых копий дисков и ошибок при удалении старых)
"C:\Program Files\Oracle VirtualBox\vboxmanage.exe" closemedium disk "C:\путь_к_папке_бэкапов\%date%\имя_вирт_диска2.vdi"

# очистка всех папок, кроме 7 последних по дате
pushd "C:\vmbackup\"
for /f "skip=7 delims=" %%a in ('dir /ad/b/o-d/tc') do >nul 2>&1 rd /s /q "%%a"
popd
сложный вопрос: реально ли результаты всех команд вывести в лог файл в папке с копией диска?
и есть ли возможность из планировщика запускать его в фоне? (чтобы окно cmd не открывылось)

Последний раз редактировалось zegordo, 17-02-2017 в 12:41.


Отправлено: 12:28, 17-02-2017 | #9


Ветеран


Сообщения: 1274
Благодарности: 564

Профиль | Отправить PM | Цитировать


Цитата zegordo:
результаты всех команд вывести в лог файл »
по простому покомандно и конечно повторять для каждой выводимой команды >>"log.txt" (пример):
Код: Выделить весь код
for %%a in ("Эта строка будет записана в файл "log.txt"") do echo %%~a>"log.txt"
но удобнее все целиком и компактнее, но это уже не по простому (если сразу вначале поставить @echo off, запись будет без команд как указано в коде ниже с этим примером, но при включенном при проверке можно растеряться и так есть кое-какие нюансы):
Код: Выделить весь код
@echo on
set "f=log.txt"
set "s1=Эта строка будет записана в файл "%f%" вместе с командой"
set "s2=Эта строка будет записана в файл "%f%" без команды"
set "s3=Эта строка не будет записана в файл "%f%" так как вывод занулен"
>"%f%" (
 for %%a in ("%s1%") do echo %%~a
 @echo.
 for %%a in ("%s2%") do @echo %%~a
 @echo.
 for %%a in ("%s3%") do @echo %%~a>nul& echo Занулена ^(пропущена^)
 @echo.
 @echo off
 for %%a in ("%s2%") do echo %%~a
)
pause
Цитата zegordo:
из планировщика запускать его в фоне? (чтобы окно cmd не открывылось) »
этот код сохранить в файле "file.vbs"
Код: Выделить весь код
WScript.CreateObject("WScript.Shell").Run """%comspec%"" /c """ & WScript.Arguments.Item(0) & """", 0, False
пример запуска: "file.vbs" "name.bat"
а в планировщике указать запуск файла "file.vbs" (путь к нему)
и добавить запуск с параметром и указать путь к "name.bat"
Это сообщение посчитали полезным следующие участники:

Отправлено: 15:43, 17-02-2017 | #10



Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » Скриптовые языки администрирования Windows » CMD/BAT - [решено] Virtualbox Backup задание в планировщике

Участник сейчас на форуме Участник сейчас на форуме Участник вне форума Участник вне форума Автор темы Автор темы Шапка темы Сообщение прикреплено

Похожие темы
Название темы Автор Информация о форуме Ответов Последнее сообщение
Службы - [решено] Не запускается задание в планировщике задач при событии простой Ferum01 Microsoft Windows 7 1 15-04-2015 13:03
Службы - [решено] Как создать задание в планировщике с помощью батника Megatron13 Microsoft Windows 7 17 15-02-2012 22:14
CMD/BAT - создать задание в планировщике ХР по запуску батника sov44 Скриптовые языки администрирования Windows 24 16-12-2011 09:05
Не могу создать задание в планировщике задач vlad_ok_777 Microsoft Windows NT/2000/2003 0 18-05-2010 14:08
Как программно добавить задание в планировщике задач RVGroup Программирование и базы данных 5 24-10-2004 18:04




 
Переход