Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #!/usr/bin/perl
- use 5.14.1;
- use strict;
- use warnings;
- use Fcntl qw(:flock);
- #use IPC::ShareLite;
- use AnyEvent;
- use Try::Tiny;
- #use Time::HiRes qw(time sleep);
- my ($minInterval,$processingTime)=@ARGV;
- $minInterval||=5;
- $processingTime||=3;
- my $pnum=0;
- sub psay {
- printf "[\@%s][%d] $_[0]\n", time(), $pnum, @_[1..$#_];
- }
- my $cv=AnyEvent->condvar;
- my @hndlSleep;
- my $fileName="/tmp/$$.lock";
- open my $fhLock,'>',$fileName;
- close $fhLock;
- $cv->begin;
- my $hndlDummyTasker=AnyEvent->timer(
- 'after'=>0,
- 'interval'=>1,
- 'cb'=>sub {
- my $flLocked;
- $pnum++;
- open my $fhLock,'<',$fileName;
- try {
- unless ($flLocked=flock($fhLock,LOCK_NB | LOCK_EX)) {
- psay 'Cant acquire lock, exiting';
- die;
- }
- psay 'Acquired lock succesfully';
- my ($prevTS)=do{ local $/; <$fhLock> }=~m/(\d+)/;
- psay 'Previous timestamp: %s', $prevTS;
- if ( $prevTS and (time() - $prevTS)<$minInterval) {
- psay 'I cant run more than 1 time in %d seconds', $minInterval;
- flock($fhLock,LOCK_UN);
- die;
- }
- open my $fhw,'>',$fileName;
- print $fhw time(),"\n";
- close $fhw;
- psay 'Oh, yes! We are here. Lets doing something nasty...';
- $cv->begin;
- $hndlSleep[$pnum]=AnyEvent->timer('after'=>3,'cb'=>sub {
- psay 'OK, we did it, bye';
- flock($fhLock,LOCK_UN);
- $cv->end;
- });
- } catch {
- flock($fhLock,LOCK_UN) if $flLocked;
- };
- }
- );
- $cv->recv();
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement