Показать полную графическую версию : [решено] 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> //эта команда сохраняет текущее состояние и выключает виртуалку. Используется именно этот вариант, т.к. не всегда перезагрузка желательна.
http://i.imgur.com/0RjP3Vn.jpg
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"
ожидание, пока не закончится операция.
http://i.imgur.com/7iPrhli.jpg
аналогично для других виртдисков(важно отметить, их количество может меняться)
vboxmanage startvm "виртуалка1" --type headless //запускает виртуалку в фоновом режиме
http://i.imgur.com/nIDBmHt.jpg
ping -n 6 127.0.0.1 >nul
аналогично для других виртуалок
проверка скриптом количества папок и, если больше 7ми, удалять самые старые по дате
архивация скопированных виртдисков(с удалением копии, с которой делался архив. Чтобы остались только архивы)
//конец скрипта
возможно имеет смысл выключить одну-сделать операции-включить и перейти на следующую виртуальную машину
но т.к. ночь, времени много, отключать все их разом или по-очереди разницы нет.
так же, клонировать диск нужно именно программой виртуалбокса, т.к. она создаёт для него уникальный номер в процессе клонирования, что позволит избежать возможные проблемы в будущем при восстановлении из бэкапа.
возможно, скрипт можно сделать значительно проще.
(или другим неведомым мне способом »
Указывая полный путь к ней.
создание папки с именем-датой по пути D:\vmbackup\ »
cd /d "D:\vmbackup"
if not exist "name_%date%" md "name_%date%"
ожидание, пока не закончится операция »
спорный момент, даже ожидая что процесс закончил свою работу (пропал) не даст гарантии что это так, надо это все знать очень хорошо и понимать именно самому, достаточтно просто использовать: timeout /? или проверять по имени в tasklist /? или еще как
проверка скриптом количества папок и, если больше 7ми, удалять самые старые по дате »
удалит все папки пропуская первые семь свежих (по дате создания)
for /f "skip=7 delims=" %%a in ('dir /ad/b/o-d/tc "papka"') do >nul 2>&1 rd /s /q "%%a"
архивация ...»
такое уже количество информации по этой части чтобы писать такой пункт, ищите ..., шансов не найти нет.
такое уже количество информации по этой части чтобы писать такой пункт, ищите ..., шансов не найти нет. »
http://forum.oszone.net/thread-311492.html годится?
спорный момент, даже ожидая что процесс закончил свою работу (пропал) не даст гарантии что это так, надо это все знать очень хорошо и понимать именно самому, достаточтно просто использовать: timeout /? или проверять по имени в tasklist /? или еще как »
а есть возможность брать в цикле через Nые промежутки времени проверку на сообщение "100%" или "created" (которое на скрине есть) и если проверка успешна, приступать к следующему пункту
а если нет - идти дальше по скрипту, оформив это в логе
а есть возможность брать в цикле ...»
а так
for /f "delims=" %%a in ('"VBoxManage clonemedium "исходный_путь_виртдиска\диск1.vdi" "D:\vmbackup\папка_с_датой\диск1.vdi""') do echo "%%a">>"log.txt"
есть нужный (или вообще что-то) вывод в файл?
Пути живые поставьте для проверки.
даже ожидая что процесс закончил свою работу (пропал) не даст гарантии что это так, »
VBoxManage.exe — CUI, по другому быть не может. Другое дело, что он может не сам обработку делать, а отдавать куда-то дальше.
а есть возможность брать в цикле через Nые промежутки времени проверку на сообщение "100%" или "created" (которое на скрине есть) и если проверка успешна, приступать к следующему пункту »
zegordo, покажите, как именно выглядит «случай если слегка подвиснет», и что при этом происходит с последующими командами, если не использовать всякие ping/timeout.
и что при этом происходит с последующими командами, если не использовать всякие 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
http://i.imgur.com/d3zEOYY.jpg
http://i.imgur.com/7TtulLg.jpg
так же, уважаемый товарищ alpap, это, я так понимаю, запись в лог?
for /f "delims=" %%a in ('"VBoxManage clonemedium "исходный_путь_виртдиска\диск1.vdi" "D:\vmbackup\папка_с_датой\диск1.vdi""') do echo "%%a">>"log.txt"
не сработал »
при ваших именах (на предоставленном выводе) код сохранить в кодировке 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
это, я так понимаю, запись в лог? »
нет, это просто я так хотел проверить вывод VBoxManage - забудьте.
на данный момент выглядит так:
# сохранение состояния вирт машины и её выключение
"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 не открывылось)
результаты всех команд вывести в лог файл »
по простому покомандно и конечно повторять для каждой выводимой команды >>"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
из планировщика запускать его в фоне? (чтобы окно cmd не открывылось) »
этот код сохранить в файле "file.vbs"
WScript.CreateObject("WScript.Shell").Run """%comspec%"" /c """ & WScript.Arguments.Item(0) & """", 0, False
пример запуска: "file.vbs" "name.bat"
а в планировщике указать запуск файла "file.vbs" (путь к нему)
и добавить запуск с параметром и указать путь к "name.bat"
не совсем понял в этом коде,
@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
)
zegordo,
ууу, как все запущено , у меня просто наводящий пример, не более:)
давайте сюда ваш полный рабочий код и напишите какую информацию из него надо получить в лог, но привязавшись к командам, в коде которые ее выдают
например, в строке: VBoxManage clonemedium...
неизвестно можно ли получить вывод в лог что-то кроме строки команды лишь
в подобной строке: ping -n 6 127.0.0.1
если не зануляя вывод можно получить, но нужен ли он, здесь важно прошел пинг или нет, зачем вам TTL=... или кол-во мс
я же не могу и думать за вас, вы сами должны определить что вы хотите анализировать как вы хотите это сделать (примерно) как хотите видеть.
для начала выложите полный рабочий код, я посмотрю и скажу что можно (желательно) вывести в лог и покажу как сделать.
на данный момент рабочий код (пути команд тестовые(но рабочие), потому и диск везде один)
# сохранение состояния вирт машины и её выключение
"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
http://i.imgur.com/0RjP3Vn.jpg
http://i.imgur.com/7iPrhli.jpg
http://i.imgur.com/nIDBmHt.jpg
команда удаления диска из вирт носителей ничего не пишет, но там это и не нужно.
собственно, всю информацию на скринах выше (включая % и сами команды) и нужно получить в логе, включая итог очистки папок(какие удалились).
команды ошибок операций vboxmanage.exe инициировать просто не получится, но выглядят они ровно таким же текстом, как на скринах выше.
например:
@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
большое спасибо!
всё работает, заменить пути в переменные это интересный подход
чтобы писал в папку с датой лог, добавил создание папки из вашего поста ранее + добавил переменную клона диска, чтобы не было путаницы.
@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
но
http://i.imgur.com/SLp7Tyy.jpg
а сам лог содержит только текст
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.
как добавить в него команды и имена удалённых папок?
...
>"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 ..., ну это на ваше усмотрение, а предупредить надо.
она естественно будет свежей и войдет в число (7) удаляемых »
не совсем понял, скрипт же оставляет 7 свежих по дате, удаляя все, кто старее, считая от 8 и старее включительно, разве нет?
проверьте строку [@>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-русская сохранён.
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, но с кириллическими именами и путями намучаетесь
не совсем понял, скрипт же оставляет 7 свежих по дате »
вы это писали когда в коде не было предусмотрено создание папки %date% (или мне так показалось), так она, эта папка, будет свежей и будет занимать одно место из 7ми, т.е. как-бы из-за нее вы оставляете теперь только 6 (с ней 7) папок, я и предположил добавить ей место и сделать конечным числов оставляемых папок - 8
а вообще (мне лично) стремно было бы держать папку с логом ((%date%), а могла бы быть и очень важная информация) в папке, в которой же происходит удаление папок или же держал просто файлом тоже с именем %date% или вообще не в этой папке.
zegordo, alpap, статус:
0%...10%...20%...30%...40%...50%...60%...70%...80%...90%...100%
пишется утилитой не в стандартный поток вывода (1), а в стандартный поток ошибок (2). Если нужно и его перенаправить в лог, то:
>"%f_log%" 2>&1 (
"%VB%" controlvm "%d_GL%" savestate
…
)
Iska,
спасибо, до меня уже позже дошло, опередили.
пока это исключено вообще из логгирования, посмотрим на ответ ТС
© OSzone.net 2001-2012
vBulletin v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.