1

Есть ли возможность запустить задачу, когда происходит определенное событие (например, вставлен флэш-накопитель), но делать это раз в месяц?

Я пытаюсь подключить мой резервный скрипт к какому-либо автоматическому событию.

ОС: Windows 7 x64 Professional

3 ответа3

2

У вас есть опыт работы с WMI (инструментарий управления Windows)? Это идеально подходит для такого рода задач. Кроме того, это часть Windows, поэтому она должна вызывать минимальные накладные расходы.

Ниже приведен пример сценария Perl, который выполняет некоторые простые действия при подключении USB-накопителя. Ваш скрипт не обязательно должен быть на Perl, WMI поддерживает целый ряд языков сценариев и программирования.

Некоторые переменные

use Win32::OLE::Const 'Microsoft WMI Scripting';

my $ComputerName = "localhost";
my $NameSpace = "root/cimv2";
my $WbemServices = Win32::OLE->GetObject("winmgmts://$ComputerName/$NameSpace");

Зарегистрировать событие (USB подключен)

my $Instance = $WbemServices->Get(__EventFilter)->SpawnInstance_();
$Instance->{Name}          = "myfilter";
$Instance->{QueryLanguage} = "WQL";
$Instance->{Query} = qq[SELECT * FROM __InstanceCreationEvent WITHIN 1
                           WHERE TargetInstance ISA 'Win32_LogicalDisk' 
                           and TargetInstance.Name<>'B:' 
                           and TargetInstance.Name<>'A:'];
    # there are other queries possible

my $Filter = $Instance->Put_(wbemFlagUseAmendedQualifiers);
my $Filterpath = $Filter->{path};

Определить действие

# example 1 : execute script
my $Instance = $WbemServices->Get(ActiveScriptEventConsumer)->SpawnInstance_();
$Instance->{Name}            = "myscript";
$Instance->{ScriptingEngine} = "PerlScript";
$Instance->{ScriptText}      = q[open FILE, ">>C:\\\\usb.txt";print FILE "USB plugged in\n";];
    # you could call your backup script / check for dates / etc.

# example 2 : execute command
my $Instance = $WbemServices->Get(CommandLineEventConsumer)->SpawnInstance_();
$Instance->{Name}                = "mycommand";
$Instance->{CommandLineTemplate} = "echo Hello world!";
    # you could call your backup script / check for dates / etc.

my $Consumer = $Instance->Put_(wbemFlagUseAmendedQualifiers);
my $Consumerpath = $Consumer->{path};

Связать событие и действие

my $Instance = $WbemServices->Get(__FilterToConsumerBinding)->SpawnInstance_();
$Instance->{Filter}   = $Filterpath;
$Instance->{Consumer} = $Consumerpath;
my $Result = $Instance->Put_(wbemFlagUseAmendedQualifiers);

Это форма постоянной регистрации события. Чтобы отключить и очистить весь процесс, удалите созданные объекты:

  • экземпляр __EventFilter "myfilter"
  • экземпляр __EventConsumer "myscript" или "mycommand"
  • экземпляр __EventToConsumerBinding

Вы можете искать объекты с помощью WMI CIM Studio. Скачать бесплатно от Microsoft можно здесь.

0

Я предлагаю планировщик заданий было бы более простой идеей. Однако успех зависит от нахождения триггера для события, и для этого я бы посмотрел в журналах событий.

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

0

Есть сценарий:

  • проверьте, существует ли файл (/etc/last_backup) И имеет ли он меньше X дней. В противном случае резервное копирование не выполняется (поскольку оно того не стоит: другое резервное копирование произошло менее 30 дней назад)

  • если он не существует или старше X dayx, он резервируется. И он касается этого файла (нажмите /etc/last_backup), когда резервное копирование завершено на 100%.

Таким образом, вы также можете узнать, когда произошло последнее полное резервное копирование (смотрите /etc /last_backup)

Способ узнать, существует ли файл и меньше ли 30 дней:

find /etc -mtime -30 | grep /etc/last_backup >/dev/null 2>/dev/null

и сразу после, $? будет "0", если grep сможет его найти

Таким образом, чтобы принудительно выполнить резервное копирование, просто удалите файл /etc /last_backup и в следующий раз скрипт запустит резервное копирование.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .