변경 사항이 있는지 디렉토리를 모니터링하려는 것 같습니다. 이것은 복잡한 일이지만 좋은 모듈이 있습니다. 가장 쉬운 방법은 아마도 Linux::Inotify2
입니다.이 모듈은 Linux 2.6.13 이상의 Inotify 파일/디렉토리 변경 알림 시스템에 대한 인터페이스를 구현합니다.
이것은 사용자가 원하는 라인을 따르는 것 같습니다.
이러한 모니터는 추가 이벤트 처리가 필요합니다. 이 예제에서는 AnyEvent을 사용합니다.
use warnings;
use strict;
use feature 'say';
use AnyEvent;
use Linux::Inotify2;
my $dir = 'dir_to_watch';
my $inotify = new Linux::Inotify2 or die "Can't create inotify object: $!";
$inotify->watch($dir, IN_MODIFY | IN_CREATE, sub {
my $e = shift;
my $name = $e->fullname;
say "$name modified" if $e->IN_MODIFY; # Both show the new file
say "$name created" if $e->IN_CREATE; # but see comments below
});
my $inotify_w = AnyEvent->io (
fh => $inotify->fileno, poll => 'r', cb => sub { $inotify->poll }
);
1 while $inotify->poll;
만 약 새로운 파일을 걱정하는 경우
는 만 위의 하나 개의 상수가 필요합니다. 두 가지 유형의 이벤트의 경우
$name
의 새 파일 이름이 있습니다. 내 시스템
... 반환 inotify_event
구조의 name
필드 man inotify
에서 디렉토리에있는 파일의 이름을 식별합니다.
구조체는 Linux::Inotify2::Watcher
개체로 적절하게 표현된다.
IN_CREATE
을 사용하면 용도에 맞는 확실한 해결책 인 것처럼 보입니다. 필자는 동일한 명령 행에서 리디렉션 된 두 개의 echo
명령과 세미콜론으로 구분 된 두 파일을 작성하고 파일을 touch
--ing하여 테스트했습니다. 작성된 파일은 별도의 이벤트로 감지되며 touch
-ed 파일도 마찬가지입니다. 이 ($dir
에서) 모니터 때문에 또한
가 ... 감시 객체 (항상 디렉토리)에서 파일 시스템 객체, 즉 파일, 디렉토리, 심볼릭 링크, 장치 노드 등이다 작동 할 수
IN_MODIFY
를 사용
...
테스트의 경우 위와 같이 echo
으로 작성된 두 파일이 별도의 이벤트로보고됩니다. 그러나 touch
-ed 파일은 데이터가 변경되지 않았기 때문에 이 아니고이보고되었습니다 (파일에 기록되지 않았습니다).
귀하의 필요에 더 잘 맞는 것은 세부 사항에 달려 있습니다. 예를 들어, 도구는 로그 파일을 시작할 때 열 수 있습니다. 나중에 훨씬 많이 쓸 수 있습니다. 위의 두 가지 방법은이 경우 다르게 작동합니다.이 모든 사항은 귀하의 특정 조건 하에서 신중하게 조사되어야합니다.
코드가 실행되는 동안 다른 파일이 들어갈 수 있기 때문에 경쟁 조건을 생각할 수 있습니다. 그러나 모듈은 그보다 훨씬 뛰어나며 처리기가 완료된 후에 새로운 변경 사항을보고합니다. 나는 코드가 실행 (그리고 잠자기)되는 동안 파일을 만들어 테스트했다.
이벤트 구동 프로그래밍을위한 다른 주목할만한 프레임 워크는 POE과 IO::Async입니다.
File::Monitor도 이와 같은 작업을 수행합니다.
zdim, 이러한 모듈에 대해 듣는 것이 좋습니다. Vikas, zdim이 제안하는 일반 파일 시스템 모니터를 찾고 있는지 확실하지 않습니다. Perl 코드를 공유 할 수 있다면 왜 우리는 많은 메모리와 CPU를 소비하는지 알아낼 수 있습니다. – codeforester