IO::Notification — 파일·디렉터리 변경의 비동기 알림

IO::Notification — 파일·디렉터리 변경의 비동기 알림

파일이나 디렉터리가 바뀌는 것을 비동기로 감지하고 싶으면 IO::Notification을 써요. 이 클래스는 기본적으로 IO::Notification.watch-path($path) 메서드를 위한 자리(placeholder) 역할을 해요. 이 메서드는 파일이나 디렉터리에 대한 IO::Notification::Change 이벤트들의 Supply를 만들어내죠.

enum FileChangeEvent (:FileChanged(1), :FileRenamed(2));

class IO::Notification {}

출처: Raku Documentation — IO::Notification

본문

메서드 (Methods)

method watch-path

method watch-path(IO::Notification: Str() $path, :$scheduler = $*SCHEDULER)

IO::Notification::Change 객체들을 방출하는 Supply를 반환해요.

$path가 파일이면 그 파일의 수정만 보고돼요. $path가 디렉터리면 디렉터리 자체의 수정(예: 권한 변경)과 디렉터리 안 파일들의 수정(새 파일 포함)이 모두 보고돼요.

:scheduler 명명 인자로 알림 스트림을 담당할 스레드 스케줄러를 지정할 수 있어요. 기본 스케줄러를 쓴다면 생략해도 돼요.

my $supply = IO::Notification.watch-path( "/var/log/syslog" );

$supply.tap( -> $v { say "Got ", $v });

sleep 60;

이 코드는 시스템 로그 파일에 감시(watch)를 설정하고, 발생한 이벤트의 종류를 방출하거나 그렇지 않으면 오류를 잡아내요. 만들어진 Supply를 tap하고 이벤트를 출력하죠. 60초 동안 이렇게 동작하며, 대략 다음처럼 출력해요.

Got /var/log/syslog: FileChanged
Got /var/log/syslog: FileChanged
Got /var/log/syslog: FileChanged
Got /var/log/syslog: FileChanged
Got /var/log/syslog: FileChanged
Got /var/log/syslog: FileChanged
Got /var/log/syslog: FileChanged
Got /var/log/syslog: FileChanged

이 메서드가 주는 유일한 정보는 '무언가 바뀌었거나 이름이 바뀌었다'라는 맨얼굴의 사실뿐이에요. 실제 변경 내용을 확인하려면 파일이나 디렉터리를 직접 열고 읽어야 해요.