sh 'sleep' and trap?
Martin Alejandro Paredes Sanchez
mapsware at prodigy.net.mx
Mon Jul 28 05:57:47 UTC 2014
El Wed, 16 Jul 2014 10:31:22 +0100
Karl Pielorz <kpielorz_lst at tdx.co.uk> escribió:
>
> Hi All,
>
> I have a script, similar to this:
>
> "
> #!/bin/sh
>
> echo $$ >/var/run/mypid.pid
> trap "rm /var/run/mypid.pid; exit 0" EXIT
>
> while [ 1 ]
> do
>
> do_stuff
> sleep 60
>
> done
> "
>
> This works - but an attempt to 'kill' it, e.g.
>
> kill `head -1 /var/run/mypid.pid`
>
> Takes up to 60 seconds, before 'sleep' completes, control returns
> back to the shell - which see's the signal, and quits.
>
> Is there a better way of doing this? - i.e. some way the shell can
> 'pass time' but still receive signals in a timely manner?
>
> The only work around I could come up with was to change the 'sleep
> 60' into a loop that does 60 * 1 second sleeps, not ideal though :(
>
> Cheers,
>
> -Karl
Try changing the signal from EXIT to TERM
trap "rm /var/run/mypid.pid; exit 0" TERM
Try/test the option trapsasync
-T trapsasync
When waiting for a child, execute traps immediately. If
this option is not set, traps are executed after the child exits,
as specified in IEEE Std 1003.2 (``POSIX.2''). This nonstandard
option is useful for putting guarding shells around
children that block signals. The surrounding shell may kill the
child or it may just return control to the tty and leave the child
alone, like this:
sh -T -c "trap 'exit 1' 2 ; some-blocking-program"
#!/bin/sh -T
More information about the freebsd-questions
mailing list