On Sat, 2007-04-07 at 12:47 -0300, Rodrigo Barbosa wrote:
-----BEGIN PGP SIGNED MESSAGE----- Hash: SHA1
On Sat, Apr 07, 2007 at 10:30:10AM +0200, Jan-Frode Myklebust wrote:
On 2007-04-07, Shawn Everett shawn@tandac.com wrote:
Just building off Micheal's idea:
killafter.sh <command> <time> #!/bin/bash
$1 & pid=$! sleep $2 kill -TERM $pid
Just in case it might have died an recycled the pid, refer to the job (%1), not the pid:
killafter.sh <command> <time> #!bin/bash $1 & sleep $2 kill -TERM %1
Another way of doing it might be to fork a sub-shell with limits:
(ulimit -t 1 ; top)
But this is cputime, not walltime...
You guys are forgetting 2 things:
Maybe he doesn't want to run the process on the background.
This is somewhat easy to solve, with a little C program.
You trap SIG_ALARM, fork, execp, and set and alarm. Another option would be to use wait/wait3/wait4 and alarm, which might be simpler. Or a combination of both.
but the main issue is
You are forgeting to take starting up time in consideration
Say a problem will take 2 seconds to start up, due to
any reason (disk I/O, memory, swap etc). If you specify 4 seconds as the limit, the problem will actually run for only 2 seconds.
I have no idea how to solve this second issue.
Run the pre-defined script with a nice command (maybe -20, etc.), start the process in background (with a somewhat smaller nice?), capture it's start time and the current time (both in seconds since epoch), take difference between them and subtract that from desired run duration, round to seconds/minutes, ..., use that value.
<snip sig stuff>
HTH -- Bill