How to stop an application in bash after a certain amount of time

How to stop an application in bash after a certain amount of time

Using a “timeout” command to stop an application or a command after a certain time limit is the best and simplest way to exists

timeout [OPTIONS] DURATION COMMAND [ARG]

Timeout Command

Timeout is a command line utility that will be available in Linux by default, This command would help us to run a command with a timeout. So that after the provided timeout settings the command will be killed automatically

timeout 60s top

Duration can be set as below

  • s – seconds (default)
  • m – minutes
  • h – hours
  • d – days

60s => 1m => 1h => 1d

timeout 1m top

The above command will kill the top command after 60 seconds. Similarly, we can use this timeout command on any of the bash commands like ping, tcpdump, jstack, etc

This utility will come in handy if we want to kill a command which is kept on running (infinite loop). One of the scenarios, I have faced recently and the timeout command helped to resolve it

Real-time Example:

In Hadoop (Cloudera), If we are running a Yarn command without a proper Kerberos ticket. The command will retry an infinite number of times and run infinitely 

Example:

# yarn application -list

WARNING: YARN_OPTS has been replaced by HADOOP_OPTS. Using value of YARN_OPTS.

23/01/05 13:04:43 INFO client.ConfiguredRMFailoverProxyProvider: Failing over to rm20

23/01/05 13:04:43 WARN ipc.Client: Exception encountered while connecting to the server : org.apache.hadoop.security.AccessControlException: Client cannot authenticate via:[TOKEN, KERBEROS]

23/01/05 13:04:43 INFO retry.RetryInvocationHandler: java.io.IOException: Failed on local exception: java.io.IOException: org.apache.hadoop.security.AccessControlException: Client cannot authenticate via:[TOKEN, KERBEROS]; Host Details : local host is: “”; destination host is: “”:8032; , while invoking ApplicationClientProtocolPBClientImpl.getApplications over rm20 after 1 failover attempts. Trying to failover after sleeping for 168ms.

23/01/05 13:04:43 INFO client.ConfiguredRMFailoverProxyProvider: Failing over to rm79

23/01/05 13:04:48 INFO retry.RetryInvocationHandler: java.net.ConnectException: Call From to:8032 failed on connection exception: java.net.ConnectException: Connection refused; For more details see:  http://wiki.apache.org/hadoop/ConnectionRefused, while invoking ApplicationClientProtocolPBClientImpl.getApplications over rm79 after 2 failover attempts. Trying to failover after sleeping for 215ms.

This will be retried an infinite number of times and to resolve the issue I used the timeout command below

timeout 60s yarn application -list

Above command helps to kill the command after the 60s, Which helps us to avoid an infinite loop of execution 🙂

Similarly, We can use this in any bash command like python script, Shell scripts, etc

timeout 10 ./test.py

Conclusion

The “timeout” command is used to run a command within the time limit provided while initiating the command.

Good Luck with your Learning!!

Similar Posts