use warnings; use strict; # PROOF OF CONCEPT ONLY # - NO race condition protection or file locking # - method for killing not entirely reliable and can loop endlessly # (see e.g. source of Time::Limit for ideas) my $PIDFILE = "foo.pid"; # FIXME: use absolute path $SIG{TERM} = sub { print "exit by signal\n"; exit 0; }; if (-e $PIDFILE) { my $oldpid = do { open my $ifh, '<', $PIDFILE or die $!; <$ifh> }; while ( kill(0,$oldpid) ) { # is proc running & can we signal it? kill 'TERM', $oldpid; sleep 1; } } END { unlink $PIDFILE } open my $ofh, '>', $PIDFILE or die $!; print $ofh $$; close $ofh; sleep 10; # do heavy work print "normal exit\n";