In Linux I would like to run a program but only for a limited time, like 1 second. If the program exceeds this running time I would like to kill the process and show an error message.
The syntax for the timeout command is as follows: timeout [OPTIONS] DURATION COMMAND [ARG]… The DURATION can be a positive integer or a floating-point number, followed by an optional unit suffix: s - seconds (default)
wait command will suspend execution of the calling thread until one of its children terminate. It will return the exit status of that command. The sleep command is used to delay the execution of the next command for a given number of seconds, hours, minutes, days. kill is used to terminate a background running process.
Using the “timeout” Command Ping your system with an IP address, it will keep on going until you terminate it by pressing CTRL+C. Now, set a time to terminate it using the “timeout” command. For instance, I will set the time to 7, which means the execution of the “ping” command will stop after 7 seconds.
Ah well. timeout(1)
.
DESCRIPTION
Start COMMAND, and kill it if still running after DURATION.
StackOverflow won't allow me to delete my answer since it's the accepted one. It's garnering down-votes since it's at the top of the list with a better solution below it. If you're on a GNU system, please use timeout
instead as suggested by @wRAR. So in the hopes that you'll stop down-voting, here's how it works:
timeout 1s ./myProgram
You can use s
, m
, h
or d
for seconds (the default if omitted), minutes, hours or days. A nifty feature here is that you may specify another option -k 30s
(before the 1s
above) in order to kill it with a SIGKILL after another 30 seconds, should it not respond to the original SIGTERM.
A very useful tool. Now scroll down and up-vote @wRAR's answer.
For posterity, this was my original - inferior - suggestion, it might still be if some use for someone.
A simple bash-script should be able to do that for you
./myProgram & sleep 1 kill $! 2>/dev/null && echo "myProgram didn't finish"
That ought to do it.
$!
expands to the last backgrounded process (through the use of &
), and kill returns false if it didn't kill any process, so the echo is only executed if it actually killed something.
2>/dev/null
redirects kill's stderr, otherwise it would print something telling you it was unable to kill the process.
You might want to add a -KILL
or whichever signal you want to use to get rid of your process too.
EDIT
As ephemient pointed out, there's a race here if your program finishes and the some other process snatches the pid, it'll get killed instead. To reduce the probability of it happening, you could react to the SIGCHLD and not try to kill it if that happens. There's still chance to kill the wrong process, but it's very remote.
trapped="" trap 'trapped=yes' SIGCHLD ./myProgram & sleep 1 [ -z "$trapped" ] && kill $! 2>/dev/null && echo '...'
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With