Exit while loop on execute script


 
Thread Tools Search this Thread
Top Forums Shell Programming and Scripting Exit while loop on execute script
# 8  
Old 05-12-2014
Thanks for your ideas. It finally works. Here is my script:

switch_hdmi.sh:
Code:
#!/bin/bash
echo $(date)  ": executing switch hdmi... $1 with pid: $$" >> /home/pi/temp_rc

time_delay=5

# create temp file with the same name but extension .pid to store process ID of this running script
FILE=$0.pid

# if file doesnt exist then create it and store current pid. this should happen only for the first time of script executing
if [ ! -e $FILE ]; then
   echo "creating new temp file $FILE and storing current pid: $$" >> /home/pi/temp_rc
   echo $$ > $FILE
fi

# kill previous process to restart timer
if [ "$1" = "restart_timer" ]; then
   echo "restarting timer. killing pid $(cat $FILE) from file: $FILE" >> /home/pi/temp_rc
   sudo kill -9 $(cat  $FILE)
   exit 0
fi

# store pid of current process
echo "storing current pid: $$" >> /home/pi/temp_rc
echo $$ > $FILE


# switch hdmi ports
switch_hdmi(){
   echo "switch to hdmi port $1" >> /home/pi/temp_rc
}


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

elif [ "$1" = "rc1_restart" ]; then
   echo $(date) ': switch hdmi to rc1 restart' >> /home/pi/temp_rc
   switch_hdmi 1

fi

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

  # execute if time expired
  if [ $time_delay -le 0 ]; then
     echo "timer expired" >> /home/pi/temp_rc
     switch_hdmi 3
     exit
  fi
done
exit 0

I used temp file to store pid of current script execution. The next script execution kill pid from temp file (previous process).

Now i can execute script switch_hdmi.sh from master script by the following command:
Code:
sudo sh /home/pi/switch_hdmi.sh restart_timer; sudo sh /home/pi/switch_hdmi.sh rc1_restart &

Any suggestions are welcome.

Last edited by armatron; 05-12-2014 at 03:03 PM..
# 9  
Old 05-12-2014
Not sure if i understood your script alltogether, but since you're asking for suggestions, i just had fun rewriting it...

Hope this helps

Code:
#!/bin/bash
# https://www.unix.com/shell-programming-and-scripting/247133-exit-while-loop-execute-script-2.html
# Fun rewrite by sea
#
#	Variables
#
	TASK="$1"			# Set argument as TASK
	ME=${0##*/}			# basename
	LOG=$HOME/$ME.log		# Logfile, to see what it does. (used to be tmp_rc)
	TMR=$HOME/$ME.timervalue	# Contains the current value of the timer
	PORT=$HOME/$ME.port		# What is its default port?
	PID=$$				# PID of this execution of script
	TIMER_DELAY=5			# Default/Start value
	time_delay=$TIMER_DELAY		# Work-value
#
#	Functions
#
	doLog() { # "MESSAGE STRING"
	# Prints current date time username,
	# followed by the supplied "message string"
		echo "$(date +'%F %T') $USER -- $1" >> $LOG
	}
	switch_hdmi(){ # NUM
	# switch hdmi ports
	# 
		doLog "switch to hdmi port $1"
		echo $1 > $PORT		# This was probably your (missing) point		?
	}
#
#	Environment checks
#
	[ -e $LOG ] || ( touch $LOG ; doLog "Created logfile of $ME" )
	[ -e $TMR ] || ( touch $TMR ; echo $TIMER_DELAY > $TMR)
#
#	Argument handling
#
	doLog "executing switch hdmi... $1 with pid: $PID"
	case "$TASK" in
	restart_timer)	doLog "restarting timer. killing pid $PID"
			sudo kill -9 $PID		# kill previous (now its current anyway) process to restart timer?
			exit 0				# Is this still required/working	?
			;;
	rc1_stop)	doLog "Switch hdmi to rc1 stop"
			switch_hdmi 1
			echo 0 > $TMR 			# stop timer
			;;
	rc1_restart)	doLog "Switch hdmi to rc1 restart"
			switch_hdmi 1
			echo $TIMER_DELAY > $TMR 	# reset timer
			;;
	*)		doLog "Call with faulty args... What to do?"
			echo "Faulty arg supplied..."
			exit 1
	esac
#
#	Action / Timer
#
	until [ $time_delay -eq 0 ] ; do
		sleep 1 				# Actualy wait a second
		time_delay=$(cat $TMR)			# Read timer value from file, if there was a change
		doLog "timer coutdown: $time_delay"	# Prints re-read timer value to log
		time_delay=$((time_delay-1))		# Update timer value
		echo $time_delay > $TMR			# Update timer file
		if [ $time_delay -le 0 ]
		then	# Time is up
			doLog "timer expired"
			switch_hdmi 3
			exit $?
		fi
	done
	exit 0

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