A puzzle with a printing function executing in background
Somebody on a thread in the (french) Mandriva Forum recently suggested a script, designed to provide a tool to display kind of "temporisation widgets" on the console (to be ultimately pasted in other more complex scripts).
One version of this script was something like the following, which seems to work fine (it displays a spinning cross and it end with just ONE ENTER keystroke) :
(sorry for not having translated comments from french)
Code:
#!/bin/bash
# Arrêt par création de fichier
# Version:1.0.2c
# Au choix: croix tournante ou barre d'avancement;
# inverser les commentaires pour sélectionner la boucle du
# mode choisi. Pour arrêter et revenir à l'invite : taper ENTREE.
#
#
clear;echo
#+++++++++++++++++++++++++++++++++++++++
# partie à insérer dans un script (supprimer la boucle superflue)
PID=$$ # PID du processus père
trap "rm -f $STOP; exit" HUP INT QUIT ABRT TERM
# Affiche la barre d'avancement (ici 5 motifs/s)
function barre()
{
tput civis;tput bold;tput sc;x=0
# Displays 5 sharps/seconds
#--------------------------
# COLS=$(tput cols) # Mémorise la largeur du terminal
# while : ; do
# sleep 0.2
# tput rc;tput hpa $x;tput el
# echo -n "#"
# let "x += 1"
# if [ $x = $COLS ]; then tput rc;tput dl1;x=0;fi
# if [ -f "$STOP" ]; then break;fi
# if [ $((x % 5)) = 0 ]; then # si Ctrl-c a tué le père, arrête le fils
# if [ "$(ps h $PID)" = "" ]; then break;fi
# fi
# done
#--------------------------
# Displays spinning cross
#---------------------------------------
while : ; do
sleep 0.125;tput rc;tput dl1;echo -n " |"
sleep 0.125;tput rc;tput dl1;echo -n " /"
sleep 0.125;tput rc;tput dl1;echo -n " -"
sleep 0.125;tput rc;tput dl1;echo -n " \\"
sleep 0.125;tput rc;tput dl1;echo -n " |"
sleep 0.125;tput rc;tput dl1;echo -n " /"
sleep 0.125;tput rc;tput dl1;echo -n " -"
sleep 0.125;tput rc;tput dl1;echo -n " \\"
if [ -f $STOP ]; then break;fi
if [ "$(ps h $PID)" = "" ]; then break;fi
done
#---------------------------------------
rm -f $STOP
tput rc;tput dl1;tput sgr0;tput cnorm;tput ed
}
#++++++++++++++++++++++++++++++++++++++++++++++++++++++++
# fin de la fonction pour un script
# Lancement de la fonction barre
barre &
# Instructions d'arrêt de la fonction
read
STOP=$(mktemp --suffix=.stop-barre --tmpdir=$HOME/tmp)
tput rc;tput dl1
sleep 1 # faire une pause pour revenir en avant-plan
# avant d'envoyer une commande d'avant plan.
exit 0
The problem is now for another version of this script, which is exactly the same with just some commented and uncommented lines, and which displays a line of sharps (#) (five # / second).
It works but - for some reason - it ends and returns to shell invite with TWO ENTER keystrokes.
Code:
#!/bin/bash
# Arrêt par création de fichier
# Version:1.0.2c
# Au choix: croix tournante ou barre d'avancement;
# inverser les commentaires pour sélectionner la boucle du
# mode choisi. Pour arrêter et revenir à l'invite : taper ENTREE.
#
#
clear;echo
#+++++++++++++++++++++++++++++++++++++++
# partie à insérer dans un script (supprimer la boucle superflue)
PID=$$ # PID du processus père
trap "rm -f $STOP; exit" HUP INT QUIT ABRT TERM
# Displays a bar (with sharps) or a cross
function barre()
{
tput civis;tput bold;tput sc;x=0
#--------------------------
COLS=$(tput cols) # Mémorise la largeur du terminal
while : ; do
sleep 0.2
tput rc;tput hpa $x;tput el
echo -n "#"
let "x += 1"
if [ $x = $COLS ]; then tput rc;tput dl1;x=0;fi
if [ -f "$STOP" ]; then break;fi
if [ $((x % 5)) = 0 ]; then # si Ctrl-c a tué le père, arrête le fils
if [ "$(ps h $PID)" = "" ]; then break;fi
fi
done
#--------------------------
# Displays spinning cross
#---------------------------------------
# while : ; do
# sleep 0.125;tput rc;tput dl1;echo -n " |"
# sleep 0.125;tput rc;tput dl1;echo -n " /"
# sleep 0.125;tput rc;tput dl1;echo -n " -"
# sleep 0.125;tput rc;tput dl1;echo -n " \\"
# sleep 0.125;tput rc;tput dl1;echo -n " |"
# sleep 0.125;tput rc;tput dl1;echo -n " /"
# sleep 0.125;tput rc;tput dl1;echo -n " -"
# sleep 0.125;tput rc;tput dl1;echo -n " \\"
# if [ -f $STOP ]; then break;fi
# if [ "$(ps h $PID)" = "" ]; then break;fi
# done
#---------------------------------------
rm -f $STOP
tput rc;tput dl1;tput sgr0;tput cnorm;tput ed
}
#++++++++++++++++++++++++++++++++++++++++++++++++++++++++
# fin de la fonction pour un script
# Lancement de la fonction barre
barre &
# Instructions d'arrêt de la fonction
read
STOP=$(mktemp --suffix=.stop-barre --tmpdir=$HOME/tmp)
tput rc;tput dl1
sleep 1 # faire une pause pour revenir en avant-plan
# avant d'envoyer une commande d'avant plan.
exit 0
Why such different behaviours ? And how to get the second version to end and go back to the shell prompt with just ONE (ENTER) keystroke.
---------- Post updated at 08:34 PM ---------- Previous update was at 08:28 PM ----------
For the french-speaking of you see the discussion about some aspects of this script :
---------- Post updated at 09:48 AM ---------- Previous update was at 07:50 AM ----------
It seems that I was mistaken. In the versions given above it seems (?) that the value of the variable STOP cannot be made available to the function barre() running in background, at least if the variable is created at the point of the script where I created it.
For other (working) versions, see the link I gave above.
Nonethelesss I seems to me that is what accounted for the difference in the number of enters needed. If I put the assignment to STOP in the proper place before the calling of "barre" then both scripts need two keystrokes to finish....
Last edited by Scrutinizer; 01-15-2011 at 06:35 AM..
---------- Post updated at 02:16 PM ---------- Previous update was at 11:36 AM ----------
Here is both versions going back to prompt with just ONE (ENTER) keystroke :
The one which displays a bar of sharps :
Code:
#!/bin/bash -
# Arrêt par création de fichier
# Version:1.0.2d
# Au choix: croix tournante ou barre d'avancement;
# Inverser les commentaires pour sélectionner la boucle du
# mode choisi. Faire Entrée pour arrêter le processus.
#
clear;echo
#+++++++++++++++++++++++++++++++++++++++ partie à insérer en tête de script (supprimer la boucle superflue)
PID=$$
# initialisation
barre-init()
{
STOP=$(mktemp -u --suffix=.stop-barre --tmpdir=$HOME/tmp)
trap "rm -f $STOP; exit" EXIT HUP INT QUIT ABRT TERM
}
# Affiche une barre avec des dièses ou une croix tournante
function barre()
{
tput civis;tput bold;tput sc
# Affiche une barre avec des dièses (5 '#'/s)
#--------------------------
COLS=$(tput cols);x=0 # Mémorise la largeur du terminal
while : ; do
sleep 0.2;tput rc;tput hpa $x;tput el;echo -n "#"
let "x += 1"
if [ $x = $COLS ]; then tput rc;tput dl1;x=0;fi
if [ -f $STOP ]; then break;fi
if [ $((x % 5)) = 0 ]; then
if [ "`ps h $PID`" = "" ]; then break;fi
fi
done
#--------------------------
# Affiche la croix tournante (1 rotation/s)
#---------------------------------------
# while : ; do
# sleep 0.125;tput rc;tput dl1;echo -n " |"
# sleep 0.125;tput rc;tput dl1;echo -n " /"
# sleep 0.125;tput rc;tput dl1;echo -n " -"
# sleep 0.125;tput rc;tput dl1;echo -n " \\"
# sleep 0.125;tput rc;tput dl1;echo -n " |"
# sleep 0.125;tput rc;tput dl1;echo -n " /"
# sleep 0.125;tput rc;tput dl1;echo -n " -"
# sleep 0.125;tput rc;tput dl1;echo -n " \\"
# if [ -f $STOP ]; then break;fi
# if [ "`ps h $PID`" = "" ]; then break;fi
# done
#---------------------------------------
tput rc;tput dl1;tput sgr0;tput cnorm;tput ed
}
#++++++++++++++++++++++++++++++++++++++++++++++++++++++++ fin de la fonction pour un script
# Lancement de la fonction: barre
barre-init # à placer dans un script au début de l'opération: téléchargement, recherche etc... ***
barre & # idem ***
# Instructions d'arrêt de ce script
read
> $STOP # instruction d'arrêt de la barre d'attente à placer à la fin de l'opération ***
tput rc;tput dl1
sleep 1 # faire une pause pour revenir en avant plan avant d'envoyer une commande d'avant plan.
exit 0
and the one which displays a rotating cross :
Code:
#!/bin/bash -
# Arrêt par création de fichier
# Version:1.0.2d
# Au choix: croix tournante ou barre d'avancement;
# Inverser les commentaires pour sélectionner la boucle du
# mode choisi. Faire Entrée pour arrêter le processus.
#
clear;echo
#+++++++++++++++++++++++++++++++++++++++ partie à insérer en tête de script (supprimer la boucle superflue)
PID=$$
# initialisation
barre-init()
{
STOP=$(mktemp -u --suffix=.stop-barre --tmpdir=$HOME/tmp)
trap "rm -f $STOP; exit" EXIT HUP INT QUIT ABRT TERM
}
# Affiche une barre avec des dièses ou une croix tournante
function barre()
{
tput civis;tput bold;tput sc
# Affiche une barre avec des dièses (5 '#'/s)
#--------------------------
# COLS=$(tput cols);x=0 # Mémorise la largeur du terminal
# while : ; do
# sleep 0.2;tput rc;tput hpa $x;tput el;echo -n "#"
# let "x += 1"
# if [ $x = $COLS ]; then tput rc;tput dl1;x=0;fi
# if [ -f $STOP ]; then break;fi
# if [ $((x % 5)) = 0 ]; then
# if [ "`ps h $PID`" = "" ]; then break;fi
# fi
# done
#--------------------------
# Affiche la croix tournante (1 rotation/s)
#---------------------------------------
while : ; do
sleep 0.125;tput rc;tput dl1;echo -n " |"
sleep 0.125;tput rc;tput dl1;echo -n " /"
sleep 0.125;tput rc;tput dl1;echo -n " -"
sleep 0.125;tput rc;tput dl1;echo -n " \\"
sleep 0.125;tput rc;tput dl1;echo -n " |"
sleep 0.125;tput rc;tput dl1;echo -n " /"
sleep 0.125;tput rc;tput dl1;echo -n " -"
sleep 0.125;tput rc;tput dl1;echo -n " \\"
if [ -f $STOP ]; then break;fi
if [ "`ps h $PID`" = "" ]; then break;fi
done
#---------------------------------------
tput rc;tput dl1;tput sgr0;tput cnorm;tput ed
}
#++++++++++++++++++++++++++++++++++++++++++++++++++++++++ fin de la fonction pour un script
# Lancement de la fonction: barre
barre-init # à placer dans un script au début de l'opération: téléchargement, recherche etc... ***
barre & # idem ***
# Instructions d'arrêt de ce script
read
> $STOP # instruction d'arrêt de la barre d'attente à placer à la fin de l'opération ***
tput rc;tput dl1
sleep 1 # faire une pause pour revenir en avant plan avant d'envoyer une commande d'avant plan.
exit 0
It's much more efficient to run tput and store it's output in a variable rather than re-running it each time you need an escape character.
Why not loop thru the 4 chars in a for loop
If you have /proc it's much more efficient to test from /proc/$PID directory rather than running ps:
Hi,
I am having script which contains many functions. Need to print each function name at the starting of the function. Like below,
functionname()
{
echo "functionname"
commands....
}
I've tried like below,
func=`grep "()" scriptname | cut -d "(" -f1`
for i in $func
do
nawk -v... (4 Replies)
Greetings, i've been working with a user-friendly menu on ksh to allow users execute scripts located on a remote server, so they wont have to login and manually launch those scripts every single time.
This is a HP-UX box and currently on a /usr/bin/ksh shell.
I've setup ssh keys on both... (1 Reply)
Here is some back ground on the script. The script is to poll an arbitrary number of DB's. To do this I am creating a function that takes the file_path to the DB and the min poll interval as arguments. The function will be called for each DB and then ran in the background. The function I was... (6 Replies)
Hi All,
I have an issue where in when i execute a script in the background using '&', it exits with stopped(SIGTTOU) signal.
There are two servers, where the Compute server is HP-Unix and Data server is Linux.
I tried using the "stty - tostop" command to disable the SIGTTOU for background... (1 Reply)
Guys
I'm working to make in AIX script and I have some commands need to be excited by that script
Like the below commands ...
startsrc -s sshd
I want that executing to be in the background of the system I do not like to see the out put of that (3 Replies)
hello all,
In my script i have written some messages which should come in screen while some background process is going on..
Like for example:
if i want to add 2 numbers a and b ...when the addition is going on in the background i should get "ADDING TWO NUMBERS>>PLEASE WAIT " message on... (3 Replies)
I'm writing a PHP script which will take a given media file and convert it into a flash (flv) file. In addition to this, once the flv file has been generated I create two thumbnails (of different sizes) from the newly generated flv file.
In order to do this I'm calling ffmpeg from the command... (4 Replies)
Dear all,
I'm writing a KornShell script that calls inside it a function in background mode
#!/bin/ksh
function myfunction
{ . . .}
myfunction |&
. . .
How can I capture the PID of the function myfunction that runs in background?
Thanks in advance
:) (2 Replies)
consider the given prg.
main() {
.....
function1(); /* to write into a file or log */
printf(" ");
.....
}
when the control reaches function1(), it should get executed in the
background.At the same time main's printf(" ") statement should also get executed.i.e... (5 Replies)