Perl File::Monitor 模块为创建的新文件通知多个通知,而我期望一个通知
Perl File::Monitor module notifying multiple notifications for the new file created whereas i expect one notification
下面是代码片段!我正在使用 Perl 模块 File::Monitor 来创建文件通知。
#!/usr/bin/perl
use strict;
use warnings;
use File::Monitor;
use File::Basename;
use Time::HiRes qw {usleep};
my $pid,@pids;
sub textfile_notifier {
my ($watch_name, $event, $change) = @_;
my @new_file_paths = $change->files_created; #The change object has a property called files_created,
#which contains the names of any new files
for my $path (@new_file_paths) {
my ($base, $fname, $ext) = fileparse($path, '.log'); # $ext is "" if the '.txt' extension is
# not found, otherwise it's '.txt'.
if ($ext eq '.log') {
print "$path was created\n";
#-----------------------------------------Forking part #-----------------------------------------
defined ($pid = fork()) or die "Couldn't fork: $!";
if ($pid == 0) { #then in child process
print "Loop got executed\n";
}
else { #then in parent process, where $pid is the pid of the child
push @pids, $pid;
}
#-----------------------------------------Forking part ends here #-----------------------------------------
}
}
}
my $monitor = File::Monitor->new();
$monitor->watch( {
name => '/home/goudarsh/Desktop/logs/',
recurse => 1,
callback => {files_created => \&textfile_notifier}, #event => handler 1
} );
$monitor->scan;
while (1) {
$monitor->scan; #Scanning the directory one
#sleep(2);
#usleep(10_000); #$microseconds = 750_000;
for my $pid (@pids) {
waitpid($pid, 0) #0 => block
}
}
文件创建
=============================
touch 1.log
touch 2.log
touch 3.log
touch 4.log
脚本的输出
=========================
/home/goudarsh/Desktop/logs/1.log was created
/home/goudarsh/Desktop/logs/2.log was created
/home/goudarsh/Desktop/logs/2.log was created
/home/goudarsh/Desktop/logs/3.log was created
/home/goudarsh/Desktop/logs/3.log was created
/home/goudarsh/Desktop/logs/3.log was created
/home/goudarsh/Desktop/logs/4.log was created
/home/goudarsh/Desktop/logs/3.log was created
/home/goudarsh/Desktop/logs/4.log was created
/home/goudarsh/Desktop/logs/4.log was created
/home/goudarsh/Desktop/logs/4.log was created
/home/goudarsh/Desktop/logs/4.log was created
/home/goudarsh/Desktop/logs/4.log was created
/home/goudarsh/Desktop/logs/4.log was created
/home/goudarsh/Desktop/logs/4.log was created
正如我所期望的那样,在终端上为一个文件打印一个 notification/alert。
我怀疑 "Forking part" 部分中存在一些错误!
知道我哪里做错了吗?
这是解决我问题的方法
use strict;
use warnings;
use File::Monitor;
use File::Basename;
use Time::HiRes qw {usleep};
my $script = '/homw/goudarsh/Desktop/script.pl';
sub textfile_notifier {
my ($watch_name, $event, $change) = @_;
my @new_file_paths = $change->files_created; #The change object has a property called files_created,
#which contains the names of any new files
for my $path (@new_file_paths) {
my ($base, $fname, $ext) = fileparse($path, '.log'); # $ext is "" if the '.txt' extension is
# not found, otherwise it's '.txt'.
if ($ext eq '.log') {
print "$path was created\n";
system("perl $script $path \&");
}
}}
my $monitor = File::Monitor->new();
$monitor->watch( {
name => '/home/goudarsh/Desktop/logs/',
recurse => 1,
callback => {files_created => \&textfile_notifier}, #event => handler 1
} );
$monitor->scan;
while (1) {
$monitor->scan; #Scanning the directory one
sleep(2);
#usleep(10_000); #$microseconds = 750_000;
}
我只想以 $path
作为参数执行 $script
,并且我使用 forking 来创建子进程,但我错误地理解了不需要使用 fork 的概念!现在不用分叉,我可以做任何需要的事情,我很高兴学习新事物
下面是代码片段!我正在使用 Perl 模块 File::Monitor 来创建文件通知。
#!/usr/bin/perl
use strict;
use warnings;
use File::Monitor;
use File::Basename;
use Time::HiRes qw {usleep};
my $pid,@pids;
sub textfile_notifier {
my ($watch_name, $event, $change) = @_;
my @new_file_paths = $change->files_created; #The change object has a property called files_created,
#which contains the names of any new files
for my $path (@new_file_paths) {
my ($base, $fname, $ext) = fileparse($path, '.log'); # $ext is "" if the '.txt' extension is
# not found, otherwise it's '.txt'.
if ($ext eq '.log') {
print "$path was created\n";
#-----------------------------------------Forking part #-----------------------------------------
defined ($pid = fork()) or die "Couldn't fork: $!";
if ($pid == 0) { #then in child process
print "Loop got executed\n";
}
else { #then in parent process, where $pid is the pid of the child
push @pids, $pid;
}
#-----------------------------------------Forking part ends here #-----------------------------------------
}
}
}
my $monitor = File::Monitor->new();
$monitor->watch( {
name => '/home/goudarsh/Desktop/logs/',
recurse => 1,
callback => {files_created => \&textfile_notifier}, #event => handler 1
} );
$monitor->scan;
while (1) {
$monitor->scan; #Scanning the directory one
#sleep(2);
#usleep(10_000); #$microseconds = 750_000;
for my $pid (@pids) {
waitpid($pid, 0) #0 => block
}
}
文件创建
=============================
touch 1.log
touch 2.log
touch 3.log
touch 4.log
脚本的输出
=========================
/home/goudarsh/Desktop/logs/1.log was created
/home/goudarsh/Desktop/logs/2.log was created
/home/goudarsh/Desktop/logs/2.log was created
/home/goudarsh/Desktop/logs/3.log was created
/home/goudarsh/Desktop/logs/3.log was created
/home/goudarsh/Desktop/logs/3.log was created
/home/goudarsh/Desktop/logs/4.log was created
/home/goudarsh/Desktop/logs/3.log was created
/home/goudarsh/Desktop/logs/4.log was created
/home/goudarsh/Desktop/logs/4.log was created
/home/goudarsh/Desktop/logs/4.log was created
/home/goudarsh/Desktop/logs/4.log was created
/home/goudarsh/Desktop/logs/4.log was created
/home/goudarsh/Desktop/logs/4.log was created
/home/goudarsh/Desktop/logs/4.log was created
正如我所期望的那样,在终端上为一个文件打印一个 notification/alert。 我怀疑 "Forking part" 部分中存在一些错误!
知道我哪里做错了吗?
这是解决我问题的方法
use strict;
use warnings;
use File::Monitor;
use File::Basename;
use Time::HiRes qw {usleep};
my $script = '/homw/goudarsh/Desktop/script.pl';
sub textfile_notifier {
my ($watch_name, $event, $change) = @_;
my @new_file_paths = $change->files_created; #The change object has a property called files_created,
#which contains the names of any new files
for my $path (@new_file_paths) {
my ($base, $fname, $ext) = fileparse($path, '.log'); # $ext is "" if the '.txt' extension is
# not found, otherwise it's '.txt'.
if ($ext eq '.log') {
print "$path was created\n";
system("perl $script $path \&");
}
}}
my $monitor = File::Monitor->new();
$monitor->watch( {
name => '/home/goudarsh/Desktop/logs/',
recurse => 1,
callback => {files_created => \&textfile_notifier}, #event => handler 1
} );
$monitor->scan;
while (1) {
$monitor->scan; #Scanning the directory one
sleep(2);
#usleep(10_000); #$microseconds = 750_000;
}
我只想以 $path
作为参数执行 $script
,并且我使用 forking 来创建子进程,但我错误地理解了不需要使用 fork 的概念!现在不用分叉,我可以做任何需要的事情,我很高兴学习新事物