Bonsoir,
je ne parviens pas à trouver une solution satisfaisante en bash pour simuler l’état en cours d’un processus, un peu à la façon de la ligne affichée en console lors d’une vérification d’intégrité des repertoires (tout les 30 fois qu’ils ont été montés, chez moi) ou du téléchargement et réception de paquets, mais attention, je parle bien que en console bien sur.
Une solution qui me mettrait pas le 2.4 Ghz Celeron à 100 % (j’ose même pas imaginer un PII avec mon script lol), c’est ce que je recherche.
j’ai cherché du côté de sleep malheurseument cette commande ne prend pas en argument les millisecondes, mais les secondes : c’est trop long !!
j’ai cherché (ça c’est la deuxième partie de mon probleme) comment notifier la fin de tâche et arrêter le script indépendant et en background de simulation de barre de progression (killall, kill, pkill…) je ne parviens pas à faire passer à la trappe le message “Complété etc … blahblahblah” lorsque je kill le processus de background, je m’étonne d’ailleurs de l’absence d’option quiet -q qui fera ça en silence …
Avez vous des idées sur comment un processus en tâche de fond pourrait mettre fin à lui même et proprement ?
Ne peux t’il y avoir d’équivalent des méthodes push(), notify() et autres que l’on trouve dans certains langages ?
Ma solution lance en fait un deuxième processus, identique, sauf que pas en background, qui va faire ce boulot (déclencher l’évenement qui fera stopper le script )… mais je suis pas trés trés content. Donc :
Comment appeler ou plutot re-appeller le script qui est en tâche de fond, sans qu’il soit lancé sous un autre pid ?
Ou comment par une commande invoqué depuis un script externe, le faire passer de Back à Front ?
voici le code, que j’ai modifié en tronquant des blocs pour que vous puissiez le tester sans besoin des autres fonctions dont normalement ce script se sert, en en laissant d’autre parceque j’ai la flemme … il y a donc des parties à ignorer (je le met en vrac) .
le script qui tourne en background :
[code]#!/bin/bash
/* Fonction qui affiche un message donnée et une succession de motif sur une seule et même ligne, simulant une */
/* progression. Reçoit deux chiffres en paramètres et le nom de la commande en cours d’exécution … le premier
chiffres */
/* est l’indice de début de la deuxième colonne, le deuxième de la troisième */
une fonction bouclant à vide
donothing() { for (( i=0; i < $1 ; i++ )); do step=0 ; done }
case $1 in
-k)
[ -z $2 ] && kill=0 || kill=$2 ;;
*) kill=""
esac
STR="J’ai lancé une tâche dans le script père (?) "
CODE_SORTIE=0
FIC_ENCOURS=/tmp/traitementEnCours # un nom de fichier, peu importe
EN_COURS=“en cours” # deux variables chaiens
TERMINE=“Terminé.” # état du processus
Teste la présence de l’option $kill, qui doit mettre fin au processus lancé en tâche de fond
case $kill in
0)
echo -ne “\r$STR succès $TERMINE\n"
wait
# Suppression des fichiers lié à ce processus, déclenche la sortie de boucle pour la tâche de fond
rm /tmp/traitementEnCours
setterm -cursor on # remet le curseur clignotant
;;
1 | -1)
STR=${STR/$EN_COURS/$TERMINE}
while [ ${#STR} -lt $(( $max2+3 )) ]; do STR=”$STR " ; done
# Teste comment s’est déroulé le processus en background, si fichier d’erreur $log ou pas
if [ -e $log ] && [ “wc -L $log | grep -o '[0-9]'
” -ne 0 ]; then
echo -ne “\r$STR Echec\n” # ajoute une chaine spécifiant l’état de sortie
else echo -ne “\r$STR Erreurs\n"
fi
CODE_SORTIE=1
# Suppression des fichiers lié à ce processus, déclenche la sortie de boucle pour la tâche de fond
rm /tmp/traitementEnCours
setterm -cursor on # remet le curseur clignotant
;;
”")
setterm -cursor off # désactive le curseur clignotant en console
[ "$max1" == "" ] && max1=40 # affecte des valeurs par défaut si besoin
[ "$max2" == "" ] && max2=60 # pour la taille des deux premières colonnes
STEP=0 # juste une variable, sans importance en soi
CAR1="--"; CAR2=" /"; CAR3=" |"; CAR4=" \\" # la suite de caractères simulant la progression
CAR="$CAR1" # initialise caractère courrant à CAR1
# Chaine de base
while [ ${#STR} -lt $max1 ]; do # boucle sur la taille du message pour l'aligner
STR="$STR " # ajoute un espsace si limite non atteinte
done
STR="$STR $EN_COURS"
while [ ${#STR} -lt $(( $max2-6 )) ]; do # pareil pour la troisième colonne, ajustée
STR="$STR " # de façon arbitraire et en dure
done
echo "$STR" > "$FIC_ENCOURS" # création du fichier, son existence sera condition de
# sortie
while [ -e /tmp/traitementEnCours ]; do # tant que ce fichier existe, boucle sur les caractères
if [ "$CAR" = "$CAR1" ]; then CAR="$CAR2" # comute les caractères
elif [ "$CAR" = "$CAR2" ]; then CAR="$CAR3"
elif [ "$CAR" = "$CAR3" ]; then CAR="$CAR4"
elif [ "$CAR" = "$CAR4" ]; then CAR="$CAR1"
fi
echo -ne "\r$STR $CAR" >&2 # affiche le message + le caractère courrant
donothing 5000
done
;;
*)
echo "kill erreur : $kill" >&2 && exit 1 ;;
esac
exit $CODE_SORTIE
[/code]
donothing, voilà le probleme, c’est évidement une boucle qui pompe les resources graves, surtout qu’en en plus de ça je rappatrie une liste de bugs depuis le BTS …
un script appelant qui pourrait faire l’affaire, pour l’exemple :
[code]#!/bin/bash
traitement() {
/home/jcode/.scripts/test.sh $* &
}
echo "je suis dans le script père, j’appelle une fonction déclarée ici et qui lance
un script fils tandis que le père va dormir un pti peu top chrono: 10 secondes."
traitement
sleep 10
traitement -k[/code]
Aprés les modifications d’usage, notamment les paths spécifiés, et le chmod u+x d’usage pour ces deux fichiers …
les erreurs devraient être dues à mon copier coller ou au votre, si il y en a.
Alors, j’imagine que ce genre de chose doit se faire en C/C++ ?
dans ce cas, je le ferai en java, je dois même déjà l’avoir au chaud dans un coin ce Thread, mais j’aurais voulu rester strictement dans le shell . Possible ?
Si pas possible, je pense notamment à réduire la priorité du processus en background, pour que la tâche principale soit pas trop lésée, (tant pis pour le lié de l’affichage ) … si vous avez la commande en tête,merci de la déposer là avec un exemple ( en ce moment j’ai pas de chance avec mes essais d’appliquer ce que dis MAN i.e pkill) … je pense à renice peut-être …