Kill process after a given time bash?

I don't know if it's identical but I did fix a similar issue a few years ago. However I'm a programmer, not a Unix-like sysadmin so take the following with a grain of salt because my Bash-fu may not be that strong...

Basically I did fork, fork and fork : )

Out of memory After founding back my old code (which I amazingly still use daily) because my memory wasn't good enough, in Bash it worked a bit like this:

commandThatMayHang.sh 2 > /dev/null 2>&1 &    # notice that last '&', we're forking
MAYBE_HUNG_PID=$!
sleepAndMaybeKill.sh $MAYBE_HUNG_PID 2 > /dev/null 2>&1 &   # we're forking again
SLEEP_AND_MAYBE_KILL_PID=$!   
wait $MAYBE_HUNG_PID > /dev/null 2>&1
if [ $? -eq 0 ]
    # commandThatMayHand.sh did not hang, fine, no need to monitor it anymore
    kill -9 $SLEEP_AND_MAYBE_KILL 2> /dev/null 2>&1
fi

where sleepAndMaybeKill.sh sleeps the amount of time you want and then kills commandThatMayHand.sh.

So basically the two scenario are:

  1. your command exits fine (before your 5 seconds timeout or whatever) and so the wait stop as soon as your command exits fine (and kills the "killer" because it's not needed anymore

  2. the command locks up, the killer ends up killing the command

In any case you're guaranteed to either succeed as soon as the command is done or to fail after the timeout.


You can set a timeout after 2 hours and restart your javaScriptThatStalls 100 times this way in a loop

seq 100|xargs -II timeout $((2 * 60 * 60)) javaScriptThatStalls

There's a GNU coreutils utility called timeout: http://www.gnu.org/s/coreutils/manual/html_node/timeout-invocation.html

If you have it on your platform, you could do:

timeout 5 CONNECT_TO_DB
if [ $? -eq 124 ]; then
    # Timeout occurred
else
    # No hang
fi

Tags:

Bash

Kill