Exit while loop on execute script


 
Thread Tools Search this Thread
Top Forums Shell Programming and Scripting Exit while loop on execute script
# 1  
Old 05-08-2014
Exit while loop on execute script

Hi,

I have first script which on IR remote command event execute the second script. If the second script is executed, it display echo "timeout expired" after 10s. This works as expected.
But I also want to reset timer (increase time) in case if the second script is executed again within 10s.

The second script have a while loop with delay:

Code:
time_delay=10
while [ $time_delay -ge 0 ]
do
  sleep 1
  if [ $time_delay -eq 0 ]
  then
     echo "timer expired"
     break
  fi

  time_delay=$(( $time_delay - 1 ))

done

The problem is, that the first script can't interrupt (reset timer) of second script when executing it when timer is not expired. The second script forces to finish the loop (echo "time expired") and after this it can be executed again.

Any suggestions please?

Last edited by Scrutinizer; 05-08-2014 at 02:12 PM.. Reason: code tags
# 2  
Old 05-08-2014
You could use a trap command, for example..
Code:
trap 'reset_counter' ALRM
reset_counter() {
  time_delay=10
}
reset_counter
until [ $time_delay -eq 0 ]
do
  sleep 1
  time_delay=$((time_delay-1))
done
echo "timer expired"

Now every time you send a kill -ALRM to the subprocess the counter is reset..

Last edited by Scrutinizer; 05-08-2014 at 02:57 PM..
# 3  
Old 05-08-2014
A simpler alternative:
Code:
trap 'sleep 10' ALRM
sleep 10
echo timer expired

This behaves differently from Scrutinizer's version. While his will reset the timer to 10s, this version will add another 10s interval once the current interval expires. If this is acceptable, the simpler code may be a viable option.

Regards,
Alister
# 4  
Old 05-08-2014
Thanks!

I put code to my script but I can not kill subprocess ALRM, so I have the same problem: timer doesn't restart back to 10s on condition "rc1_restart".

Here is my code:
Code:
#!/bin/bash

def_sleep_time=10

if [ $1 = "rc1_stop" ]; then
   echo $(date) ': switch hdmi to rc1 stop' >> /home/pi/temp_rc
   def_sleep_time=0 #this should stop timer

elif [ $1 = "rc1_restart" ]; then
   echo $(date) ': switch hdmi to rc1 restart' >> /home/pi/temp_rc
   kill -ALRM # this should reset timer

fi

trap 'reset_counter' ALRM
reset_counter() {
  time_delay=$def_sleep_time
}

reset_counter

until [ $time_delay -eq 0 ]
do
  sleep 1
  echo "timer coutdown: $time_delay" >> /home/pi/temp_rc
  time_delay=$((time_delay-1))

  if [ $time_delay -eq 0 ]; then
     echo "timer expired" >> /home/pi/temp_rc
  fi
done


Last edited by armatron; 05-09-2014 at 02:40 AM..
# 5  
Old 05-08-2014
You need to send the signal to the proper process id.

If you are using a shell whose read builtin supports a timeout, you can use that. Instead of communicating via signals, use a fifo.

Regards,
Alister
# 6  
Old 05-09-2014
I dont want to kill the whole script, because this would stop the timer and not restart it.

I assume I should kill only subproces "ALRM" (or whatever that means) to exit while loop and restart timer.

Is it possible to do that in the same script? What kind of signal should I sent to what process ID? kill -ALRM doesn't work.

If I run script by pressing a key on remote control, I got this (before timer expired):
Code:
ps aux | grep switch_hdmi.sh

root      2784  0.0  0.1   1716   504 ?        S    07:42   0:00 sh -c sudo sh /home/pi/switch_hdmi.sh rc1_restart
root      2785  6.0  0.4   3952  1656 ?        S    07:42   0:00 sudo sh /home/pi/switch_hdmi.sh rc1_restart
root      2786  0.0  0.1   1716   528 ?        S    07:42   0:00 sh /home/pi/switch_hdmi.sh rc1_restart
pi        2790  0.0  0.1   1976   616 pts/0    S+   07:42   0:00 grep switch_hdmi.sh


Last edited by armatron; 05-09-2014 at 02:46 AM..
# 7  
Old 05-09-2014
If you take a look at the man page:
Code:
NAME
     kill -- terminate or signal a process

SYNOPSIS
     kill [-s signal_name] pid ...
     kill -l [exit_status]
     kill -signal_name pid ...
     kill -signal_number pid ...

DESCRIPTION
     The kill utility sends a signal to the processes specified by the pid operand(s).

The kill command can be used to terminate a process or to signal it. The latter is what it is used for here. You'll notice the command also needs a pid (Process Id).

You can obtain the pid in the parent process by using the $! variable, right after you fire off a process in the background..

Code:
somescript &
childpid=$!
echo $childpid
wait $childpid


Last edited by Scrutinizer; 05-09-2014 at 05:31 AM..
Login or Register to Ask a Question

Previous Thread | Next Thread

10 More Discussions You Might Find Interesting

1. Homework & Coursework Questions

Loop Script with wget until exit is typed

Morning all, I am attempting to complete the below script which will do the following (skip the ping part) using Bash. Prompts the user to type in a URL to download, or to type exit to exit the script. If a URL is typed, wget to download the webpage and then loop back to prompting for a... (2 Replies)
Discussion started by: Jgerds1990
2 Replies

2. Shell Programming and Scripting

Trying to loop through folders and execute an existing python script.

I am trying to loop through lots and lots of folders and use the names of the folders to run a Python script which has parameters. E.g. -- setup_refs -n John -f England/London/Hackney/John -c con/con.cnf Normally to run `setup_refs` once from command line it's: `python setup_refs.py -n John... (3 Replies)
Discussion started by: Mr_Keystrokes
3 Replies

3. Shell Programming and Scripting

While loop is causing ssh command to exit from script after first iteration.

I am trying to check multiple server's "uptime" in a loop over "ssh". When I execute multiple ssh commands with hard coded servernames script is executing fine. But when I pass server names using while loop, script is exiting after checking first server's status, why? # serverList... (8 Replies)
Discussion started by: kchinnam
8 Replies

4. UNIX for Dummies Questions & Answers

Execute shell script and if string found while executing then exit

Hi All, I have one shell script start.sh which executes another shell script test.sh something like below :test.sh -param1 -param2 In the test.sh there is one command for removing file:rm file1.bak I want whenever I execute start.sh, it will execute test.sh and if it finds string rm... (7 Replies)
Discussion started by: ORAI
7 Replies

5. Shell Programming and Scripting

Bash Question: HowTo Exit Script with User Input While Process is Running Mid-Loop?

Hi, I have written a script that allows me to repetitively play a music file $N times, which is specified through user input. However, if I want to exit the script before it has finished looping $N times, if I use CTRL+c, I have to CTRL+c however many times are left in order to complete the loop.... (9 Replies)
Discussion started by: hilltop_yodeler
9 Replies

6. Emergency UNIX and Linux Support

For loop exit

Below for loop not exiting. Can someone help? JBOSS_INST_ARGS=01 02 if ; then for i in $JBOSS_INST_ARGS; do /u/jboss-6.1.0.Final/bin/jboss_init_wise$i.sh start; done (8 Replies)
Discussion started by: vino_hymi
8 Replies

7. Shell Programming and Scripting

Exit from loop

hi, how to exit from "if" loop?actually i have mutliple "if" conditions, i have to exit from each "if" loop,if it is true...:confused: Please suggest me... (3 Replies)
Discussion started by: sreelu
3 Replies

8. Shell Programming and Scripting

Exit for loop in a shell script if a condition is successfull

Hi All, I am stuch in a script where a for loop is running to execute some commands for some values. Now my problem is i have to have an if condition that if the first iteration is successful then it has to exit the for loop otherwise it has to continue normally. my code is this: for... (5 Replies)
Discussion started by: usha rao
5 Replies

9. Shell Programming and Scripting

loop does not execute in bash script?

I have a very basic bash shell script, which has many "while... done; for .... done" loop clauses, like the following ~~ #!/bin/bash while blablalba; do .... done < /tmp/file for line in `cat blablabla`; do grep $line /tmp/raw ; done > /tmp/1; while blablalba2; do .... done <... (2 Replies)
Discussion started by: fedora
2 Replies

10. Shell Programming and Scripting

while loop exit

i wrote a while script as part of a huge program. this script, once picked, begins to output data to the person using it. pretty easy, as the person doesn't have to keep typing commands to get the output that the while loop automatically throws out. now, the thing is, while this while-script... (3 Replies)
Discussion started by: Terrible
3 Replies
Login or Register to Ask a Question