特定のイベントでタスクを実行しますが、月に 1 回のみ実行します。

特定のイベントでタスクを実行しますが、月に 1 回のみ実行します。

特定のイベント(フラッシュ ドライブの挿入など)が発生したときにタスクを実行し、それを月に 1 回だけ実行するオプションはありますか?

バックアップ スクリプトを何らかの自動イベントにフックしようとしています。

OS: Windows 7 x64 プロフェッショナル

答え1

WMI(Windows 管理インストルメンテーション)? この種のタスクに最適です。また、Windows の一部であるため、オーバーヘッドは最小限に抑えられます。

以下は、USB ドライブが接続されたときにいくつかの簡単なアクションを実行する Perl スクリプトの例です。スクリプトは Perl で記述する必要はありません。WMI はさまざまなスクリプト言語とプログラミング言語をサポートしています。

いくつかの変数

use Win32::OLE::Const 'Microsoft WMI Scripting';

my $ComputerName = "localhost";
my $NameSpace = "root/cimv2";
my $WbemServices = Win32::OLE->GetObject("winmgmts://$ComputerName/$NameSpace");

イベントを登録する (USB が接続された)

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};

アクションを定義する

# 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};

イベントとアクションをリンクする

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

これは永続的なイベント登録の形式です。プロセス全体を無効にしてクリーンアップするには、作成されたオブジェクトを削除します。

  • __EventFilter インスタンス "myfilter"
  • __EventConsumer インスタンス "myscript" または "mycommand"
  • __EventToConsumerBindingインスタンス

WMI CIM Studioを使用してオブジェクトを検索できます。Microsoftから無料でダウンロードできます。ここ

答え2

スクリプトを用意してください:

  • ファイル (/etc/last_backup) が存在し、かつ X 日未満であるかどうかを確認します。そうでない場合はバックアップしません (価値がないため: 別のバックアップが 30 日以内に発生しました)

  • 存在しないか、X 日よりも古い場合は、バックアップします。そして、バックアップが 100% 完了したら、そのファイル (touch /etc/last_backup) にアクセスします。

そうすれば、最後のフルバックアップがいつ行われたかも知ることができます(/etc/last_backupを参照)。

ファイルが存在し、30 日未満であるかどうかを確認する方法:

find /etc -mtime -30 | grep /etc/last_backup >/dev/null 2>/dev/null

そしてその直後、grepが見つけることができた場合、$?は「0」になります。

このように、バックアップを強制するには、/etc/last_backup ファイルを削除するだけで、次回スクリプトがバックアップを開始します。

答え3

タスク スケジューラを使用する方が簡単だと思います。ただし、成功するかどうかはイベントのトリガーを見つけるかどうかにかかっており、そのためにはイベント ログを調べる必要があります。

私の考えは、バックアップ コマンドを習得し、スクリプトに保存してから、タスク スケジューラ サービスのパワーを使用してタイミングを処理することです。

関連情報