How to kill a child process after a given timeout in Bash? Ask Question

How to kill a child process after a given timeout in Bash? Ask Question

I have a bash script that launches a child process that crashes (actually, hangs) from time to time and with no apparent reason (closed source, so there isn't much I can do about it). As a result, I would like to be able to launch this process for a given amount of time, and kill it if it did not return successfully after a given amount of time.

Is there a simple and robust way to achieve that using bash?

ベストアンサー1

(As seen in: BASH FAQ entry #68: "How do I run a command, and have it abort (timeout) after N seconds?")

You can use timeout*:

timeout 10 ping www.goooooogle.com

Otherwise, do what timeout does internally:

( cmdpid=$BASHPID; (sleep 10; kill $cmdpid) & exec ping www.goooooogle.com )

In case you want to do a timeout for longer bash code, use the second option as such:

( cmdpid=$BASHPID; 
    (sleep 10; kill $cmdpid) \
   & while ! ping -w 1 www.goooooogle.com 
     do 
         echo crap; 
     done )

* It's included in GNU Coreutils 8+, so most current Linux systems have it installed already, otherwise you can install it, e.g. sudo apt-get install timeout or sudo apt-get install coreutils

おすすめ記事