![Execute uma tarefa em um evento específico, mas apenas uma vez por mês](https://rvso.com/image/1345258/Execute%20uma%20tarefa%20em%20um%20evento%20espec%C3%ADfico%2C%20mas%20apenas%20uma%20vez%20por%20m%C3%AAs.png)
Existe alguma opção para executar uma tarefa quando ocorre um evento específico (ou seja, Flash Drive inserido), mas fazê-lo apenas uma vez por mês?
Estou tentando conectar meu script de backup em algum evento automático.
SO: Windows 7 x64 Profissional
Responder1
Você tem experiência com WMI (Instrumentação de gerenciamento do Windows)? É perfeito para este tipo de tarefas. Além disso, faz parte do Windows, portanto deve causar sobrecarga mínima.
Abaixo está um exemplo de script Perl que executa algumas ações simples quando uma unidade USB é conectada. Seu script não precisa estar em Perl, o WMI oferece suporte a uma ampla gama de linguagens de script e programação.
Algumas variáveis
use Win32::OLE::Const 'Microsoft WMI Scripting';
my $ComputerName = "localhost";
my $NameSpace = "root/cimv2";
my $WbemServices = Win32::OLE->GetObject("winmgmts://$ComputerName/$NameSpace");
Registrar evento (usb conectado)
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};
Definir ação
# 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};
Vincular evento e ação
my $Instance = $WbemServices->Get(__FilterToConsumerBinding)->SpawnInstance_();
$Instance->{Filter} = $Filterpath;
$Instance->{Consumer} = $Consumerpath;
my $Result = $Instance->Put_(wbemFlagUseAmendedQualifiers);
Esta é uma forma de inscrição permanente no evento. Para desabilitar e limpar todo o processo, remova os objetos criados:
- a instância __EventFilter "myfilter"
- a instância __EventConsumer "myscript" ou "mycommand"
- a instância __EventToConsumerBinding
Você pode procurar os objetos usando o WMI CIM Studio. Para download gratuito da Microsoft,aqui.
Responder2
Tenha o roteiro:
verifique se um arquivo (/etc/last_backup) existe E tem menos de X dias. Caso contrário, não faz backup (pois não vale a pena: outro backup ocorreu há menos de 30 dias)
se não existir ou for mais antigo que X dayx, ele faz backup. E toque nesse arquivo (toque em /etc/last_backup) quando o backup estiver 100% concluído.
Dessa forma, você também pode saber quando ocorreu o último backup completo (veja /etc/last_backup)
Uma forma de saber se o arquivo existe e tem menos de 30 dias:
find /etc -mtime -30 | grep /etc/last_backup >/dev/null 2>/dev/null
e imediatamente depois, $? será "0" se o grep puder encontrá-lo
Dessa forma, para forçar o backup, basta remover o arquivo /etc/last_backup e na próxima vez o script iniciará o backup.
Responder3
Sugiro que o Agendador de Tarefas seja uma ideia mais simples. Porém, o sucesso depende de encontrar um gatilho para o evento, e para isso eu procuraria nos logs de eventos.
Meu pensamento é dominar o comando de backup, salvar em um script e usar o poder do serviço Agendador de Tarefas para lidar com o tempo.