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

1

Existe alguma opção para executar uma tarefa quando ocorre um evento específico (por exemplo, Flash Drive inserido), mas para fazê-lo apenas uma vez por mês?

Estou tentando ligar meu script de backup em algum evento automático.

SO: Windows 7 x64 Professional

    
por Joudicek Jouda 03.01.2013 / 14:26

3 respostas

2

Você tem experiência com o WMI ( Gerenciamento do Windows Instrumentação )? É perfeito para esse tipo de tarefa. Além disso, faz parte do Windows, portanto, deve causar sobrecarga mínima.

Abaixo está um exemplo de um script Perl que executa algumas ações simples quando uma unidade USB é conectada. Seu script não precisa estar em Perl, o WMI suporta toda uma 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};

Evento e ação do link

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

Esta é uma forma de registro permanente de eventos. Para desativar e limpar todo o processo, remova os objetos criados:

  • a instância __EventFilter "myfilter"
  • a instância de __EventConsumer "myscript" ou "mycommand"
  • a instância __EventToConsumerBinding

Você pode pesquisar os objetos usando o WMI CIM Studio. Disponível para download da Microsoft gratuitamente, aqui .

    
por 03.01.2013 / 15:56
0

Tenha o script:

  • verifique se existe um arquivo (/ etc / last_backup) AND com menos de X dias. Não faz backup de outra forma (como não vale a pena: outro backup ocorreu há menos de 30 dias)

  • se não existe, ou é mais antigo que X dayx, é 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 o último backup completo ocorreu (veja / etc / last_backup)

Uma maneira 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 que o script iniciar o backup.

    
por 03.01.2013 / 14:46
0

Sugiro que o Agendador de Tarefas seja uma ideia mais simples. No entanto, 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.

    
por 03.01.2013 / 19:05