¿Existe alguna opción para ejecutar una tarea cuando ocurre un evento específico (es decir, se inserta una unidad flash), pero hacerlo solo una vez al mes?
Estoy intentando conectar mi script de respaldo a algún evento automático.
SO: Windows 7 x64 Profesional
Respuesta1
¿Tiene experiencia con WMI (Instrumentación de Administración Windows)? Es perfecto para este tipo de tareas. Además, es parte de Windows, por lo que debería causar una sobrecarga mínima.
A continuación se muestra un ejemplo de una secuencia de comandos Perl que ejecuta algunas acciones simples cuando se conecta una unidad USB. Su secuencia de comandos no tiene que estar en Perl, WMI admite una amplia gama de lenguajes de programación y secuencias de comandos.
Algunas variables
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 acción
# 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 y acción
my $Instance = $WbemServices->Get(__FilterToConsumerBinding)->SpawnInstance_();
$Instance->{Filter} = $Filterpath;
$Instance->{Consumer} = $Consumerpath;
my $Result = $Instance->Put_(wbemFlagUseAmendedQualifiers);
Esta es una forma de registro permanente de eventos. Para deshabilitar y limpiar todo el proceso, elimine los objetos creados:
- la instancia de __EventFilter "myfilter"
- la instancia de __EventConsumer "myscript" o "mycommand"
- la instancia __EventToConsumerBinding
Puede buscar los objetos utilizando WMI CIM Studio. Descargable desde Microsoft de forma gratuita,aquí.
Respuesta2
Ten el guión:
compruebe si existe un archivo (/etc/last_backup) Y tiene menos de X días. De lo contrario, no realiza copias de seguridad (ya que no vale la pena: se realizó otra copia de seguridad hace menos de 30 días)
si no existe, o tiene más de X días x, realiza una copia de seguridad. Y toca ese archivo (toca /etc/last_backup) una vez que la copia de seguridad esté completa al 100%.
De esa manera también podrás saber cuándo se realizó la última copia de seguridad completa (mira /etc/last_backup)
Una forma de saber si el archivo existe y tiene MENOS de 30 días:
find /etc -mtime -30 | grep /etc/last_backup >/dev/null 2>/dev/null
e inmediatamente después, $? será "0" si grep pudiera encontrarlo
De esa manera, para forzar la copia de seguridad, simplemente elimine el archivo /etc/last_backup y la próxima vez el script iniciará la copia de seguridad.
Respuesta3
Sugiero que el Programador de tareas sería una idea más sencilla. Sin embargo, el éxito depende de encontrar un desencadenante del evento, y para eso buscaría en los registros de eventos.
Mi idea es dominar el comando de copia de seguridad, guardarlo en un script y luego usar el poder del servicio Programador de tareas para manejar el tiempo.