2016-12-18 3 views
3

리눅스 OS (CentOS)로 실험을하고 동일한 환경에서 생성 된 모든 툴 로그를 추적하고 싶습니다. 툴은 이러한 변화를 추적하기 위해 각각의 로그 (.log extn)를 생성합니다. 내가 설정 한 디렉토리와 새 파일이 생성되면 출력에 표시됩니다. 그러나 이것은 수면 기간으로 2 초를 설정했기 때문에 많은 메모리와 CPU 사용량을 소비합니다.linux에서 inode를 사용하여 새 파일을 만들 때마다 파일의 절대 경로와 함께 파일 이름을 가져 오는 방법은 무엇입니까?

내 질문 "이 작업을 수행하는 방법이 있습니까?" 시스템의 모든 변경 사항을 추적하기 위해 inode 테이블을 사용하려고 생각했습니다. 이게 내 문제를 해결할 수 있습니까? 그렇다면 우리는 같은 방향으로 해결책을 알려줄 수 있습니까?

+0

zdim, 이러한 모듈에 대해 듣는 것이 좋습니다. Vikas, zdim이 제안하는 일반 파일 시스템 모니터를 찾고 있는지 확실하지 않습니다. Perl 코드를 공유 할 수 있다면 왜 우리는 많은 메모리와 CPU를 소비하는지 알아낼 수 있습니다. – codeforester

답변

9

변경 사항이 있는지 디렉토리를 모니터링하려는 것 같습니다. 이것은 복잡한 일이지만 좋은 모듈이 있습니다. 가장 쉬운 방법은 아마도 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 파일은 데이터가 변경되지 않았기 때문에 이 아니고이보고되었습니다 (파일에 기록되지 않았습니다).

귀하의 필요에 더 잘 맞는 것은 세부 사항에 달려 있습니다. 예를 들어, 도구는 로그 파일을 시작할 때 열 수 있습니다. 나중에 훨씬 많이 쓸 수 있습니다. 위의 두 가지 방법은이 경우 다르게 작동합니다.이 모든 사항은 귀하의 특정 조건 하에서 신중하게 조사되어야합니다.

코드가 실행되는 동안 다른 파일이 들어갈 수 있기 때문에 경쟁 조건을 생각할 수 있습니다. 그러나 모듈은 그보다 훨씬 뛰어나며 처리기가 완료된 후에 새로운 변경 사항을보고합니다. 나는 코드가 실행 (그리고 잠자기)되는 동안 파일을 만들어 테스트했다.

이벤트 구동 프로그래밍을위한 다른 주목할만한 프레임 워크는 POEIO::Async입니다.

File::Monitor도 이와 같은 작업을 수행합니다.

+0

내 스크립트에서는 파일을보기 위해 File :: Monitor를 사용하고 있지만 스크립트를 3 일 이상 실행하면 CPU 사용량이 더 많이 소모됩니다. 나는 새로운 inode가 생성되었을 때 그 inode를 사용하여 파일 이름을 쉽게 얻을 수 있도록 리눅스의 inode를 추적 할 수있는 방법을 원한다. 그래서 inode를 추적 할 방법이 있습니까? –

+0

@vikaschib 의견을 보내 주셔서 감사합니다! 이것이 제가 처음으로이 모듈을 추천 한 이유입니다 - 여러분이 묻는 정확하게'inotify' 시스템을 구현합니다. 나는 그것을 손으로하는 것을 추천하지 않을 것이다. (재미를 제외하고.) 증가 된 CPU 사용량에 관해서는 ... 그것은 모듈의 문제일지도 모르는 것처럼 들린다. 나는 다음과 같이 제안 할 것이다. (1) 이것을 시도하라. (2) 스크립트가 오랫동안 계속 실행되지 않도록 스케줄 할 수 있는가? 아마도 종료하고 다시 시작하십시오 (cron 작업에 의해?) (3) 문제가 지속되면 다른 질문을 게시하십시오. – zdim

관련 문제