Execute uma tarefa em um evento específico, mas apenas uma vez por mês

Execute uma tarefa em um evento específico, mas apenas uma vez por mês

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.

informação relacionada