Hello,
    I should add that in the below script MAKEPORT is another script that I have 
performing once there is a change in the directory.
> 
> From: <[EMAIL PROTECTED]>
> Date: 2003/06/26 Thu PM 05:20:51 EDT
> To: [EMAIL PROTECTED], [EMAIL PROTECTED]
> Subject: Re: Re: Hmm....is a hot directory possible?
> 
> I keep forgetting to post the hold group.  Hopes this helps.
> 
> #!/usr/bin/perl -w
> 
> use strict;
> use POSIX qw(setsid);
> 
> # set costants
> my$MAKEPORT="/home/jspencer/bin/make-port";
> 
> 
> # daemonize the program
> &daemonize;
> 
> while(1) {
> # set costants
> [EMAIL PROTECTED]("/home/jspencer/acucorp/std/std-unix-misc.tar.gz") ;
> my$FIRSTTIME = "$FILETIME[9]";
> my$SECTIME=scalar time;
> 
> sleep(2);
> 
>         if (($FIRSTTIME + 2) > $SECTIME) {
>              system($MAKEPORT);
> }}
> 
> sub daemonize {
> 
> my $outlog = '/home/jspencer/bin/daemons/logs/hotfolder_out.log';
> my $errorlog = '/home/jspencer/bin/daemons/logs/hotfolder_error.log';
> 
> 
> chdir '/'                 or die "Can't chdir to /: $!";
> umask 0;
> open STDIN, '/dev/null'   or die "Can't read /dev/null: $!";
> open STDOUT, ">$outlog" or die "Can't write to /dev/null: $!";
> open STDERR, ">$errorlog" or die "Can't write to /dev/null: $!";
> defined(my $pid = fork)   or die "Can't fork: $!";
> exit if $pid;
> setsid                    or die "Can't start a new session: $!";
> }
> > 
> > From: david <[EMAIL PROTECTED]>
> > Date: 2003/06/26 Thu PM 04:16:49 EDT
> > To: [EMAIL PROTECTED]
> > Subject: Re: Hmm....is a hot directory possible?
> > 
> > Chris Zimmerman wrote:
> > 
> > > -----BEGIN PGP SIGNED MESSAGE-----
> > > Hash: SHA1
> > > 
> > > Is there some way that I can write a bit of code that will watch a
> > > directory and as soon as a file is written to that directory, something is
> > > run against
> > > that file?  What would be the best way to turn this into a daemon?
> > > 
> > 
> > you could take a look at the stat function provided by Perl to see if the 
> > directory's last modified time or inode change time changed:
> > 
> > #!/usr/bin/perl -w
> > use strict;
> > 
> > my($pmm,$pic);
> > 
> > while(1){
> > 
> >         my($mm,$ic) = (stat('/tmp'))[9,10];
> > 
> >         if($pmm and $pic and $pmm != $mm || $pic != $ic){
> >                 print "some change to /tmp\n";
> >         }else{
> >                 print ".\n";
> >         }
> > 
> >         $pmm=$mm;
> >         $pic=$ic;
> > 
> >         sleep(7);
> > }
> > 
> > __END__
> > 
> > 1. this is not a daemon.
> > 2. this only reports there are some changes (it could be adding a file or 
> > deleting a file,etc) in /tmp but you don't know what really happened there.
> > 3. this only reports changes to /tmp not knowing any change below the /tmp 
> > level. for example:
> > 
> > #--
> > #-- the scrpipt report the following 3 changes to /tmp
> > #--
> > mkdir /tmp/another
> > touch /tmp/hi
> > rm -f /tmp/hi
> > 
> > #--
> > #-- but doesn't know the following 3 changes
> > #--
> > mkdir /tmp/another/yet
> > touch /tmp/another/yet/file
> > rm -fr /tmp/another/yet
> > 
> > because there is really no change to /tmp, only its child directory.
> > 
> > solution to #2 and #3 can do done with a different approch. something like 
> > the following might work:
> > 
> > 1. recursively cache (in a hash) all sub directories and files under /tmp 
> > during start up of your daemon.
> > 2. once a while, do the same resursive scan for the /tmp directory and 
> > compare the directory content with the hash you cached a while ago.
> > 3. if there is any differences, you know something has changed and because 
> > you have 2 hashs, you can easily find out what really happened. for 
> > example, if the first hash has an entry where the second hash doesn't, you 
> > know something has been deleted from the directory. Or if the second hash 
> > has something that's missing from the first hash, you know there are new 
> > files.
> > 4. update the cache to be the most recent scan. repeat step #2.
> > 
> > File::Find module can help you do the recursive scan portion fairly easily. 
> > you can take the same approach but instead of caching the directory 
> > contents, you can cache each sub directory's last modified time instead. 
> > this will reduce the size of your hash a bit. either way, even this 
> > approach has many drawback:
> > 
> > 1. if you target directory is huge, the scaning part will take a long time 
> > which brings us to the 2 drawback.
> > 2. race condition. it's totally possible for a file to appear and disappear 
> > during your directory scan especially if the scan takes a long time or the 
> > directory is "busy" (means there are tons of activity in the directory so 
> > files appear and disappear really fast). your scan will miss those.
> > 
> > you might need to apply some kind of locking to the directory during the 
> > scan. finally, take a look in CPAN to see if something comes up. on top of 
> > my head, i don't remember any modules that does what you want. good luck.
> > 
> > david
> > 
> > -- 
> > To unsubscribe, e-mail: [EMAIL PROTECTED]
> > For additional commands, e-mail: [EMAIL PROTECTED]
> > 
> > 
> 
> 
> -- 
> To unsubscribe, e-mail: [EMAIL PROTECTED]
> For additional commands, e-mail: [EMAIL PROTECTED]
> 
> 


-- 
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]

Reply via email to