Bash while loop to run command for specific time with examples

Introduction

How to run a shell script for 5 minutes in a bash while loop? linux sleep. bash wait. bash for loop. bash script for loop. for loop in shell script. bash sleep. script timer. How to loop a function to run for certain minutes and then exit? How to run a command in a shell script for few minutes and exit? Script Timer condition while loop in a shell. while loop a function and sleep to run for 15 minutes. shell script to run a command every 5 minutes using bash while loop. bash while duration. shell for loop. run bash script timer.

How to have a bash script run while loop until a specific time?

 

Earlier I had written an article on shell scripting interview questions along with their answers. In this article I will show some examples to run a function or command for specific time using bash while loop.

Advertisement

 

bash while loop for 5 minutes (define sleep duration as 30 seconds)

Here I have created a small script which will run for 5 minutes, and will run a command every 10 seconds. You can increase the Linux sleep timer from 10 seconds to any value for which you wish the script to wait before running the same command again. To wait for 1 minute you can use "sleep 1m"

Change the runtime variable value if you wish to change the total script timer for which the loop should run. So if you wish to run the while loop for 10 minutes then put runtime="10 minute"

# cat /tmp/testscript.sh
#!/bin/bash

runtime="5 minute"
endtime=$(date -ud "$runtime" +%s)

while [[ $(date -u +%s) -le $endtime ]]
do
    echo "Time Now: `date +%H:%M:%S`"
    echo "Sleeping for 10 seconds"
    sleep 10
done

Running our script. I have trimmed the output.

# /tmp/testscript.sh
Time Now: 23:56:26
Sleeping for 10 seconds
Time Now: 23:56:36
Sleeping for 10 seconds
Time Now: 23:56:46
Sleeping for 10 seconds
Time Now: 23:56:56
Sleeping for 10 seconds
Time Now: 23:57:06
Sleeping for 10 seconds

<<Output trimmed>>

Time Now: 00:00:56
Sleeping for 10 seconds
Time Now: 00:01:06
Sleeping for 10 seconds
Time Now: 00:01:16
Sleeping for 10 seconds
Time Now: 00:01:26
Sleeping for 10 seconds

 

bash while loop for 5 minutes (define sleep duration 1 minute)

Here we have kept our Linux sleep script timer as 1 minute so the date command will run every minute until 5 minute completes. You can replace the date command with any other command which you wish to execute.

# cat /tmp/testscript.sh
#!/bin/bash

runtime="5 minute"
endtime=$(date -ud "$runtime" +%s)

while [[ $(date -u +%s) -le $endtime ]]
do
    echo "Time Now: `date +%H:%M:%S`"
    echo "Sleeping for 1 minute"
    sleep 1m
done

Running our script

# /home/oamsys/testscript.sh
Time Now: 23:58:43
Sleeping for 1 minute
Time Now: 23:59:43
Sleeping for 1 minute
Time Now: 00:00:43
Sleeping for 1 minute
Time Now: 00:01:43
Sleeping for 1 minute
Time Now: 00:02:43
Sleeping for 1 minute
Time Now: 00:03:43
Sleeping for 1 minute

 

bash while loop for 5 minutes (define sleep duration 10 seconds)

In this sample script I will use a different logic to run my command for 5 minutes for every 10 seconds. Now you can tweak the script and modify the Linux sleep script timer for the time period you wish to keep as interval before running the command.

Advertisement
# cat /tmp/testscript.sh
#!/bin/bash

wait_period=0

while true
do
    echo "Time Now: `date +%H:%M:%S`"
    echo "Sleeping for 10 seconds"
    # Here 300 is 300 seconds i.e. 5 minutes * 60 = 300 sec
    wait_period=$(($wait_period+10))
    if [ $wait_period -gt 300 ];then
       echo "The script successfully ran for 5 minutes, exiting now.."
       break
    else
       sleep 10
    fi
done

Running the sample script

# /tmp/testscript.sh
Time Now: 00:27:26
Sleeping for 10 seconds
Time Now: 00:27:36
Sleeping for 10 seconds
Time Now: 00:27:46
Sleeping for 10 seconds
Time Now: 00:27:56
Sleeping for 10 seconds
Time Now: 00:28:06
Sleeping for 10 seconds
Time Now: 00:28:16
Sleeping for 10 seconds

<<output trimmed>>

Sleeping for 10 seconds
Time Now: 00:31:36
Sleeping for 10 seconds
Time Now: 00:31:46
Sleeping for 10 seconds
Time Now: 00:31:56
Sleeping for 10 seconds
Time Now: 00:32:06
Sleeping for 10 seconds
Time Now: 00:32:16
Sleeping for 10 seconds
Time Now: 00:32:26
Sleeping for 10 seconds
The script successfully ran for 5 minutes, exiting now..

 

How to wait for background process for certain time before terminating

Now you may also have a requirement to send a process to background and then wait for the process id to complete before exiting the script. But you may also not want to wait for infinite period and want a wrapper timeout which will monitor the wait command and then terminate the background process id if it is running for too long.

Here is a small script where we will send two commands 2 background and then wait for them to complete but if they took too long then those will be forcefully terminated.

#!/bin/bash

echo "$(date +%H:%M:%S): start"
pids=()
timeout 10 bash -c 'sleep 20; echo "$(date +%H:%M:%S): job 1 terminated successfully"' &
pids+=($!)
timeout 2 bash -c 'sleep 5; echo "$(date +%H:%M:%S): job 2 terminated successfully"' &
pids+=($!)
for pid in ${pids[@]}; do
   wait $pid
   exit_status=$?
   if [[ $exit_status -eq 124 ]]; then
      echo "$(date +%H:%M:%S): $pid terminated by timeout"
   else
      echo "$(date +%H:%M:%S): $pid exited successfully"
   fi
done

 

Here, we are using timeout command to monitor the background process i.e. sleep. You can replace sleep with actual command or application. As you can see, the timeout value is lower then sleep to demonstrate that timeout will forcefully terminate the background process.

We will store the PIDs of the background process into a variable and use wait command to monitor those PIDs to complete.

Output:

~]# sh /tmp/script.sh 
22:03:27: start
22:03:37: 7637 terminated by timeout
22:03:37: 7638 terminated by timeout

As expected, both the commands are forcefully terminated. timeout will terminate any process with exit code 124 so we monitor the exit code to confirm the behvaior.

 

Summary

In this tutorial I shared multiple commands and methods to run a loop for a specific time. You can use the same to control a for loop, until loop using a sleep timer. I also shared a sample script to wait for a back ground process for a certain period of time and then terminate it forcefully using the process id.

 

Further Reading

How do I pause my shell script for a second before continuing?
Bash: wait with timeout

 

Didn't find what you were looking for? Perform a quick search across GoLinuxCloud

If my articles on GoLinuxCloud has helped you, kindly consider buying me a coffee as a token of appreciation.

Buy GoLinuxCloud a Coffee

For any other feedbacks or questions you can either use the comments section or contact me form.

Thank You for your support!!

1 thought on “Bash while loop to run command for specific time with examples”

  1. WOW!!.
    How did you ever figure out the date command syntax to do this .. Ive read the help/man but maybe im missed something.

    runtime="5 minute"
    endtime=$(date -ud "$runtime" +%s)

    Anyways this is 100% awsome

    Reply

Leave a Comment

X