Есть ли возможность запускать задачу при наступлении определенного события (например, при вставке флэш-накопителя), но делать это только раз в месяц?
Я пытаюсь привязать свой скрипт резервного копирования к какому-то автоматическому событию.
ОС: Windows 7 x64 Professional
решение1
Есть ли у вас опыт работы с 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 бесплатно,здесь.
решение2
Иметь сценарий:
проверяет, существует ли файл (/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, и в следующий раз скрипт запустит резервное копирование.
решение3
Я предлагаю использовать Task Scheduler как более простую идею. Однако успех зависит от поиска триггера для события, и для этого я бы посмотрел в журналах событий.
Я думаю, что нужно освоить команду резервного копирования, сохранить ее в скрипте, а затем использовать возможности службы планировщика заданий для управления временем.