signal processing INT or TERM

2008-10-30 Thread icarus
perl 5.8.2
OS: AIX fully POSIX compliant

my script moves files from one dir to another.
When I want my script to stop, should I pass it along the signal INT
or TERM?

INT just interrupts the script.  It finishes whatever it's processing
and then it's done.

TERM on the other hand, just sends a TERMination signal, waits a few
seconds, then KILLs the program.  TERM is more common I guess when
starting/stopping unix shell scripts in the init dir.

My fear is that if I pass the TERM signal, maybe the system will chop
off the files that are being moved on the fly.  The "few seconds" are
unpredictable in value at least on my system. So the system might say
'it's been too long, let's kill it."

Any thoughts? Is there a "perlish" way to do it?





-- 
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]
http://learn.perl.org/




Re: signal processing INT or TERM

2008-10-31 Thread Mark Wagner
On Wed, Oct 29, 2008 at 13:50, icarus <[EMAIL PROTECTED]> wrote:
> perl 5.8.2
> OS: AIX fully POSIX compliant
>
> my script moves files from one dir to another.
> When I want my script to stop, should I pass it along the signal INT
> or TERM?
>
> INT just interrupts the script.  It finishes whatever it's processing
> and then it's done.
>
> TERM on the other hand, just sends a TERMination signal, waits a few
> seconds, then KILLs the program.  TERM is more common I guess when
> starting/stopping unix shell scripts in the init dir.
>
> My fear is that if I pass the TERM signal, maybe the system will chop
> off the files that are being moved on the fly.  The "few seconds" are
> unpredictable in value at least on my system. So the system might say
> 'it's been too long, let's kill it."
>
> Any thoughts? Is there a "perlish" way to do it?

I'd send a custom signal (say, USR1).  When the script receives that
signal, it sets a flag indicating it should perform a clean exit.
Totally untested:

--
my $done = 0;

sub sigusr {
$done = 1;
}

$SIG{USR1} = \&sigusr;

while(!$done)
{
# Do something
}
# Clean up and exit
--

It won't work if "do something" is perpetually blocked on a read or
somesuch, but if you wake up periodically to go through the loop,
you'll be fine.

-- 
Mark Wagner

-- 
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]
http://learn.perl.org/