X-Git-Url: http://git.indexdata.com/?p=mkws-moved-to-github.git;a=blobdiff_plain;f=test%2Fbin%2Fbomb.pl;h=2dde3d48f37ec1012e98d627f01f2c1db5da628f;hp=6211eab85b49ac4067eeac8dfdc84f6b2ae76b29;hb=e037fab727a9eb80c33f1693fcd6d0b67b84da32;hpb=a353544f60e704aca2e4bb68ae8a59e16e7a8624 diff --git a/test/bin/bomb.pl b/test/bin/bomb.pl index 6211eab..2dde3d4 100755 --- a/test/bin/bomb.pl +++ b/test/bin/bomb.pl @@ -1,5 +1,5 @@ #!/usr/bin/perl -# Copyright (c) 2014 IndexData ApS. http://indexdata.com +# Copyright (c) 2014 Index Data ApS. http://indexdata.com # # bomb.pl - wrapper to stop a process after N seconds # @@ -38,20 +38,39 @@ my @system = @ARGV; die usage if $help; die usage if !@system; +# disabled - we set the CPU limit in the wrapper ./bomb +## set CPU limit, in case the alarm handler will +## be ignored +#eval { +# require BSD::Resource; +# BSD::Resource::setrlimit( "RLIMIT_CPU", $timeout, 2 * $timeout ) +# or die "Cannot set CPU limit: $!\n"; +#}; +#if ($@) { +# warn +# "WARNING: things would go more nicely with the BSD::Resource package\n"; +#} + # -# use fork/exec instead system() +# configure signal handlers # -$pid = fork(); -die "fork() failed: $!" unless defined $pid; +$SIG{ALRM} = sub { + my $pgid = getpgrp(); -# child -if ($pid) { - alarm($timeout); - exec(@system) or die "exec @system: $!\n"; -} + warn "Alarm handler got called after $timeout seconds\n"; + warn "Kill now the process group $pgid\n\n"; + warn "Command: @system\n"; -# parent -else { } + # kill process group + kill "INT", -$pgid; +}; -1; +# don't kill ourself +$SIG{INT} = "IGNORE"; +alarm($timeout); + +system(@system) == 0 + or die "system('@system') failed: ?='$?', !='$!'\n"; + +1;