특정 이벤트가 발생할 때(예: 플래시 드라이브 삽입) 작업을 실행하되 한 달에 한 번만 실행하도록 하는 옵션이 있습니까?
일부 자동 이벤트에 백업 스크립트를 연결하려고 합니다.
OS: 윈도우 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일x보다 오래된 경우 백업됩니다. 그리고 백업이 100% 완료되면 해당 파일을 터치합니다(/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
작업 스케줄러가 더 간단한 아이디어라고 제안합니다. 그러나 성공 여부는 이벤트에 대한 트리거를 찾는 데 달려 있으며 이에 대해서는 이벤트 로그를 살펴보겠습니다.
내 생각은 백업 명령을 마스터하고 스크립트에 저장한 다음 작업 스케줄러 서비스의 기능을 사용하여 타이밍을 처리하는 것입니다.