Gibt es eine Option, eine Aufgabe auszuführen, wenn ein bestimmtes Ereignis eintritt (z. B. ein Flash-Laufwerk eingelegt), dies aber nur einmal im Monat zu tun?
Ich versuche, mein Backup-Skript an ein automatisches Ereignis anzuhängen.
Betriebssystem: Windows 7 x64 Professional
Antwort1
Haben Sie Erfahrung mit WMI (Windows-Verwaltungsinstrumentation)? Es ist perfekt für diese Art von Aufgaben. Außerdem ist es ein Teil von Windows, sodass es nur minimalen Mehraufwand verursachen sollte.
Unten sehen Sie ein Beispiel für ein Perl-Skript, das einige einfache Aktionen ausführt, wenn ein USB-Laufwerk angeschlossen wird. Ihr Skript muss nicht in Perl sein, WMI unterstützt eine ganze Reihe von Skript- und Programmiersprachen.
Einige Variablen
use Win32::OLE::Const 'Microsoft WMI Scripting';
my $ComputerName = "localhost";
my $NameSpace = "root/cimv2";
my $WbemServices = Win32::OLE->GetObject("winmgmts://$ComputerName/$NameSpace");
Ereignis registrieren (USB eingesteckt)
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};
Aktion definieren
# 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};
Ereignis und Aktion verknüpfen
my $Instance = $WbemServices->Get(__FilterToConsumerBinding)->SpawnInstance_();
$Instance->{Filter} = $Filterpath;
$Instance->{Consumer} = $Consumerpath;
my $Result = $Instance->Put_(wbemFlagUseAmendedQualifiers);
Dies ist eine Form der permanenten Ereignisregistrierung. Um den gesamten Prozess zu deaktivieren und zu bereinigen, entfernen Sie die erstellten Objekte:
- die __EventFilter-Instanz "myfilter"
- die __EventConsumer-Instanz "myscript" oder "mycommand"
- die __EventToConsumerBinding-Instanz
Sie können mit WMI CIM Studio nach den Objekten suchen. Dieses kann kostenlos von Microsoft heruntergeladen werden.Hier.
Antwort2
Habe das Skript:
prüft, ob eine Datei (/etc/last_backup) existiert UND weniger als X Tage alt ist. Andernfalls führt sie kein Backup durch (weil es sich nicht lohnt: ein anderes Backup ist vor weniger als 30 Tagen erfolgt)
wenn sie nicht existiert oder älter als X Tagx ist, wird sie gesichert. UND sie berührt diese Datei (berührt /etc/last_backup), sobald die Sicherung zu 100 % abgeschlossen ist.
Auf diese Weise können Sie auch erfahren, wann die letzte vollständige Sicherung durchgeführt wurde (siehe /etc/last_backup).
So können Sie feststellen, ob die Datei existiert und WENIGER als 30 Tage alt ist:
find /etc -mtime -30 | grep /etc/last_backup >/dev/null 2>/dev/null
und unmittelbar danach wird $? „0“ sein, wenn grep es finden konnte
Um eine Sicherung zu erzwingen, entfernen Sie einfach die Datei /etc/last_backup. Beim nächsten Mal startet das Skript dann die Sicherung.
Antwort3
Ich schlage vor, dass die Taskplanung eine einfachere Idee wäre. Der Erfolg hängt jedoch davon ab, einen Auslöser für das Ereignis zu finden, und dafür würde ich in den Ereignisprotokollen nachsehen.
Meine Idee ist, den Sicherungsbefehl zu beherrschen, ihn in einem Skript zu speichern und dann die Leistung des Taskplanungsdienstes zu nutzen, um die zeitliche Steuerung zu übernehmen.