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

Компьютерный форум 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

 

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


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

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


не совсем понял в этом коде,

Код: Выделить весь код
@echo on
cd /d "C:\vmbackup"
if not exist "%date%" md "%date%"
set "f=C:\vmbackup\%date%\log.txt"
set "s1=а куда, собственно, вписывать команду? Особенно, если в ней кавычки уже есть, например [C:\Program Files\Oracle VirtualBox\vboxmanage.exe" controlvm "имя виртуалки" savestate]"
>"%f%" (
 for %%a in ("%s1%") do echo %%~a
 @echo.
@echo off
)

Отправлено: 23:22, 17-02-2017 | #11



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

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


Ветеран


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

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


zegordo,
ууу, как все запущено , у меня просто наводящий пример, не более

давайте сюда ваш полный рабочий код и напишите какую информацию из него надо получить в лог, но привязавшись к командам, в коде которые ее выдают
например, в строке: VBoxManage clonemedium...
неизвестно можно ли получить вывод в лог что-то кроме строки команды лишь
в подобной строке: ping -n 6 127.0.0.1
если не зануляя вывод можно получить, но нужен ли он, здесь важно прошел пинг или нет, зачем вам TTL=... или кол-во мс

я же не могу и думать за вас, вы сами должны определить что вы хотите анализировать как вы хотите это сделать (примерно) как хотите видеть.

для начала выложите полный рабочий код, я посмотрю и скажу что можно (желательно) вывести в лог и покажу как сделать.

Отправлено: 01:12, 18-02-2017 | #12


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


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

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


на данный момент рабочий код (пути команд тестовые(но рабочие), потому и диск везде один)
Код: Выделить весь код
# сохранение состояния вирт машины и её выключение
"C:\Program Files\Oracle VirtualBox\vboxmanage.exe" controlvm "GLPI рабочая" savestate

# клонирование диска с присваиванием ему нового uuid
"C:\Program Files\Oracle VirtualBox\vboxmanage.exe" clonemedium "C:\Users\admin\Documents\Virtualbox VMs\GLPI рабочая\GLPI рабочая-disk1.vdi" "C:\vmbackup\%date%\GLPI рабочая-disk2.vdi"

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

#удаление нового жёсткого диска из менеджера виртуальных носителей (virtual media manager)
"C:\Program Files\Oracle VirtualBox\vboxmanage.exe" closemedium disk "C:\vmbackup\%date%\GLPI рабочая-disk2.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
что пишут команды vboxmanage.exe
сохранение состояния вирт машины с её выключением

клонирование диска

запуск вирт машины


команда удаления диска из вирт носителей ничего не пишет, но там это и не нужно.
собственно, всю информацию на скринах выше (включая % и сами команды) и нужно получить в логе, включая итог очистки папок(какие удалились).
команды ошибок операций vboxmanage.exe инициировать просто не получится, но выглядят они ровно таким же текстом, как на скринах выше.

Отправлено: 13:26, 18-02-2017 | #13


Ветеран


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

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


например:
Код: Выделить весь код
@echo off
set "VB=C:\Program Files\Oracle VirtualBox\vboxmanage.exe"
set "f_GL=GLPI рабочая-disk2.vdi"
set "d_GL=GLPI рабочая"
set "d_del=C:\vmbackup"
set "f_log=log.txt"
>"%f_log%" (
 "%VB%" controlvm "%d_GL%" savestate
 "%VB%" clonemedium "C:\Users\admin\Documents\Virtualbox VMs\%d_GL%\%f_GL%" "C:\vmbackup\%date%\%f_GL%"
 "%VB%" startvm "%d_GL%" --type headless
 "%VB%" closemedium disk "C:\vmbackup\%date%\%f_GL%"
 for /f "skip=7 delims=" %%a in ('dir /ad/b/o-d/tc "%d_del%"') do @rd /s /q "%d_del%\%%a"
)
pause
Это сообщение посчитали полезным следующие участники:

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


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


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

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


большое спасибо!
всё работает, заменить пути в переменные это интересный подход
чтобы писал в папку с датой лог, добавил создание папки из вашего поста ранее + добавил переменную клона диска, чтобы не было путаницы.
Код: Выделить весь код
@echo off
cd /d "C:\vmbackup"
if not exist "%date%" md "%date%"
set "VB=C:\Program Files\Oracle VirtualBox\vboxmanage.exe"
set "f_GL1=GLPI рабочая-disk1.vdi"
set "f_GL2=GLPI рабочая-disk2.vdi"
set "d_GL=GLPI рабочая"
set "d_del=C:\vmbackup"
set "f_log=C:\vmbackup\%date%\log.txt"
>"%f_log%" (
 "%VB%" controlvm "%d_GL%" savestate
 "%VB%" clonemedium "C:\Users\admin\Documents\Virtualbox VMs\%d_GL%\%f_GL1%" "C:\vmbackup\%date%\%f_GL2%"
 "%VB%" startvm "%d_GL%" --type headless
 "%VB%" closemedium disk "C:\vmbackup\%date%\%f_GL2%"
 for /f "skip=7 delims=" %%a in ('dir /ad/b/o-d/tc "%d_del%"') do @rd /s /q "%d_del%\%%a"
)
pause
но
проценты остаются в cmd окне

а сам лог содержит только текст
Код: Выделить весь код
Clone medium created in format 'VDI'. UUID: f1b31377-47f0-40bb-b5f8-6145c11977e5
Waiting for VM "GLPI рабочая" to power on...
VM "GLPI рабочая" has been successfully started.
как добавить в него команды и имена удалённых папок?

Отправлено: 16:45, 18-02-2017 | #15


Ветеран


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

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


Код: Выделить весь код
...
>"log.txt" (
 @>nul "%VB%" controlvm "%d_GL%" savestate
 ...
 @echo Удалены с содержимым:
 for /f "skip=7 delims=" %%a in ('dir /ad/b/o-d/tc "%d_del%"') do @echo %d_del%\%%a& rd /s /q "%d_del%\%%a"
)
pause
проверьте строку [@>nul "%VB%" controlvm "%d_GL%" savestate], не убьет ли случайно это не только вывод но и операцию

Вообще с учетом что вы заходите в папку код можно так переписать:
Код: Выделить весь код
@echo off
cd /d "C:\vmbackup"
if not exist "%date%" md "%date%"
set "VB=C:\Program Files\Oracle VirtualBox\vboxmanage.exe"
set "f_GL1=GLPI рабочая-disk1.vdi"
set "f_GL2=GLPI рабочая-disk2.vdi"
set "d_GL=GLPI рабочая"
set "f_log=%date%\log.txt"
>"%f_log%" (
 @>nul "%VB%" controlvm "%d_GL%" savestate
 "%VB%" clonemedium "C:\Users\admin\Documents\Virtualbox VMs\%d_GL%\%f_GL1%" "%date%\%f_GL2%"
 "%VB%" startvm "%d_GL%" --type headless
 "%VB%" closemedium disk "%date%\%f_GL2%"
 @echo Удалены с содержимым:
 for /f "skip=7 delims=" %%a in ('dir /ad/b/o-d/tc') do @echo %%a& rd /s /q "%%a"
)
pause
но есть одно но, я его не знал. Удаление папок происходит в этой же папке, а вы создаете папку (опять же здесь) с именем "%date%", она естественно будет свежей и войдет в число (7) удаляемых, поэтому, наверное, есть смысл записать for /f "skip=8 ..., ну это на ваше усмотрение, а предупредить надо.
Это сообщение посчитали полезным следующие участники:

Отправлено: 18:52, 18-02-2017 | #16


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


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

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


Цитата alpap:
она естественно будет свежей и войдет в число (7) удаляемых »
не совсем понял, скрипт же оставляет 7 свежих по дате, удаляя все, кто старее, считая от 8 и старее включительно, разве нет?
Цитата alpap:
проверьте строку [@>nul "%VB%" controlvm "%d_GL%" savestate], не убьет ли случайно это не только вывод но и операцию »
удивительно, ничего не изменилось
те же проценты в cmd окне и та же инфа в логе
Код: Выделить весь код
Clone medium created in format 'VDI'. UUID: b24af47a-68af-4e18-9363-e64c32d622f4
Waiting for VM "GLPI рабочая" to power on...
VM "GLPI рабочая" has been successfully started.
“¤*«Ґ*л б ᮤҐа¦Ё¬л¬:
jhashah
shshhs
23424
shshsh
hsjsjsjj
вместо кракозябр - Удалены с содержимым быть должны, но этого нет и это странно - код в 866 oem-русская сохранён.

Отправлено: 20:21, 18-02-2017 | #17


Ветеран


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

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


zegordo,
ладно сделаем в лоб
Код: Выделить весь код
@echo off
cd /d "C:\vmbackup"
if not exist "%date%" md "%date%"
set "VB=C:\Program Files\Oracle VirtualBox\vboxmanage.exe"
set "f_GL1=GLPI рабочая-disk1.vdi"
set "f_GL2=GLPI рабочая-disk2.vdi"
set "d_GL=GLPI рабочая"
set "f_log=%date%\log.txt"
"%VB%" controlvm "%d_GL%" savestate
"%VB%" clonemedium "C:\Users\admin\Documents\Virtualbox VMs\%d_GL%\%f_GL1%" "%date%\%f_GL2%"
"%VB%" startvm "%d_GL%" --type headless>>"%f_log%"
"%VB%" closemedium disk "%date%\%f_GL2%">>"%f_log%"
echo Удалены с содержимым:>>"%f_log%"
for /f "skip=7 delims=" %%a in ('dir /ad/b/o-d/tc') do echo %%~fa>>"%f_log%"& rd /s /q "%%a"
pause
код сохранить в 866 это понятно, но и файл-лог должен быть в 866 чтобы нормально его прочитать, у меня в AkelPadовском блокноте автоматом файлы создаются в 866, можете пересохранить или все затачивать изначально под 1251, но с кириллическими именами и путями намучаетесь

Цитата zegordo:
не совсем понял, скрипт же оставляет 7 свежих по дате »
вы это писали когда в коде не было предусмотрено создание папки %date% (или мне так показалось), так она, эта папка, будет свежей и будет занимать одно место из 7ми, т.е. как-бы из-за нее вы оставляете теперь только 6 (с ней 7) папок, я и предположил добавить ей место и сделать конечным числов оставляемых папок - 8

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

Отправлено: 22:37, 18-02-2017 | #18


Ветеран


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

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


zegordo, alpap, статус:
Код: Выделить весь код
0%...10%...20%...30%...40%...50%...60%...70%...80%...90%...100%
пишется утилитой не в стандартный поток вывода (1), а в стандартный поток ошибок (2). Если нужно и его перенаправить в лог, то:
Цитата:
Код: Выделить весь код
>"%f_log%" 2>&1 (
    "%VB%" controlvm "%d_GL%" savestate
    …
)
Это сообщение посчитали полезным следующие участники:

Отправлено: 23:55, 18-02-2017 | #19


Ветеран


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

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


Iska,
спасибо, до меня уже позже дошло, опередили.
пока это исключено вообще из логгирования, посмотрим на ответ ТС

Отправлено: 02:25, 19-02-2017 | #20



Компьютерный форум 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




 
Переход