#1 Le 10/10/2016, à 15:24
- Beuhlet_Reseau
Script Stop - Commandes Unix Stop
Bonjour à toutes & à tous,
Je fais mon retour au développement et comme souvent on fait des petites louperies ...
Mes problèmes sont les suivants :
J'ai lancé une commande de traitement de fichier (awk) sur un fichier qui à mon grand désarroi, se rempli à l'infini...
Je l'ai lancé il y a de ça 3 heures et quand je supprime le fichier de destination de ce traitement je vois qu'il se recrée (donc que ma commande a du se perdre quelque part)
Avez vous une idée pour stoper cette commande ?
Du coup, ce problème m'amène à penser :
Pour mon script que j'élabore, je veux éviter ce genre de souci. Avez des "Best Practise" à inclure dans un script bash afin de se prémunir contre des fonctionnements anormales d'un script ? Du style boucle infini, surcharge système ... ?
On m'a parlé des commandes Break et exit ? Mais aussi de Top timetout....
Je veux pouvoir à n'importe quel moment, stoper mon script. Qu'en pensez vous ?
Grand merci pour votre aide
Cordialement
L'avenir appartient à ceux qui se lèvent tôt... Pas ceux qui crachent trop (vite?).
Hors ligne
#2 Le 10/10/2016, à 16:02
- Watael
Re : Script Stop - Commandes Unix Stop
salut,
tu peux toujours kill une commande "en cours".
kill $(pidof -x tonScript) #ou kill $(pgrep tonScript)
si ça ne suffit pas, tu peux indiquer le signal à envoyer au script pour le tuer (voir kill -l).
Connected \o/
Welcome to sHell. · eval is evil.
Hors ligne
#3 Le 10/10/2016, à 16:05
- pires57
Re : Script Stop - Commandes Unix Stop
J'en penses que :
- Sans voir le script il va être difficile de t'aider.
- Que awk n'a probablement rien à voir avec le fait que ton fichier se rempli.
Un exemple avec exit:
BEGIN {
if (("date" | getline date_now) <= 0) {
print "Can't get system date" > "/dev/stderr"
exit 1
}
print "current date is", date_now
close("date")
}
@watael: il est préférable de fermer le process de manière correct.
Dernière modification par pires57 (Le 10/10/2016, à 16:16)
Utilisateur d'Archlinux, Ubuntu et Kali Linux
Administrateur système et réseau spécialisé Linux.
LinkedIn
Hors ligne
#4 Le 10/10/2016, à 16:51
- Beuhlet_Reseau
Re : Script Stop - Commandes Unix Stop
D'accord, je reviendrais sur ce problème. Lorsque je lance mon script j'ai ceci comme erreur :
./script_cra_ent: line 85: unexpected EOF while looking for matching `"'
./script_cra_ent: line 90: syntax error: unexpected end of file
Mon erreur se situe au niveau de ma boucle et de son incrémentation $j + 1.
##########################################################################"
Partons du principe que j'ai déclaré toutes mes variables :
Mon script fait ceci :
Récupération brute d'informations provenant d'un fichier popo vers un fichier TMP
Sur mon fichier TMP je récupère mes champs souhaités que je redirige vers TMP2
On va compter le nbr de lignes de TMP2 pour faire une boucle qu'on incrémente (j+1)
=> Ici je fais un gros formatage pour avoir un fichier avec la forme que je souhaite que je redirige vers analyse...
jour=$(date +%Y%m%d)
heure2ago=$(date +%H -d '2 hour ago')
zcat popo_$jour$heure2ago > $tmp
awk -F "|" '{print $9,$14,$22,$31,$33}' $tmp > $tmp2
#Liberation du fichier tmp pour autre utilisation
[ -f $tmp ] && rm -f $tmp
#On va compter le nbre de ligne pour initialiser une boucle
NB_LIGNE=`cat $tmp2 | wc -l`
echo "Initialisation d'une boucle afin de pouvoir lire ligne par ligne le fichier formaté:"
j=1
while [ $j -le $NB_LIGNE ]
do
#Lis le contenu du fichier formater, l'option sed ici va lire ligne par ligne
cat $tmp2 | sed -n "$j"p > $tmp
if [ -s $tmp ] #Le fichier existe et n'est pas vide
then
Date=`cat $tmp2 | sed -n "$j"p | awk -F" " '{print $1}'`
BP=`cat $tmp2 | sed -n "$j"p | awk -F" " '{print $2}'`
VHex=`cat $tmp2 | sed -n "$j"p | awk -F" " '{print $3}'`
BillDist=`cat $tmp2 | sed -n "$j"p | awk -F" " '{print $4}'`
IDHex=`cat $tmp2 | sed -n "$j"p | awk -F" " '{print $5}'`
VDecimal=`echo $((16#$VolumeHex))`
IDDecimal=`echo $((16#$PLMNIDHex))`
echo ""$Date;""$BP;""$VDecimal;""$BillDist;""$IDDecimal;"" >> $analyse_cra
else
echo "Erreur"
fi
echo "Traitement de la ligne $j terminé"
j=`expr $j + 1`
done
[ -f $tmp ] && rm -f $tmp
[ -f $tmp2 ] && rm -f $tmp2
Modération : merci à l'avenir d'utiliser les balises code (explications ici).
Dernière modification par cqfd93 (Le 10/10/2016, à 17:07)
L'avenir appartient à ceux qui se lèvent tôt... Pas ceux qui crachent trop (vite?).
Hors ligne
#5 Le 10/10/2016, à 17:36
- Beuhlet_Reseau
Re : Script Stop - Commandes Unix Stop
Finalement l'erreur était
echo "Traitement de la ligne $j terminee"
Fallait mettre
echo "Traitement de la ligne "$j" terminee"
.
Mon script fonctionne mais a chaque ligne j'ai ces erreurs :
./script_cra_: line 74: 16#LEG_ENT: value too great for base (error token is "16#LEG_ENT")
10/10/2016
./script_cra_: line 78: 12:27:12: command not found
./script_cra_: line 78: : command not found
./script_cra_: line 78: 06FAF0: command not found
./script_cra_: line 78: 1: command not found
./script_cra_: line 78: : command not found
Traitement de la ligne 81 terminee
./script_cra_: line 74: 16#LEG_ENT: value too great for base (error token is "16#LEG_ENT")
10/10/2016
./script_cra_: line 78: 12:28:09: command not found
./script_cra_: line 78: : command not found
./script_cra_: line 78: 17CB: command not found
./script_cra_: line 78: 1: command not found
./script_cra_: line 78: : command not found
Traitement de la ligne 82 terminee
L'avenir appartient à ceux qui se lèvent tôt... Pas ceux qui crachent trop (vite?).
Hors ligne
#6 Le 10/10/2016, à 17:43
- pingouinux
Re : Script Stop - Commandes Unix Stop
Bonjour,
Il faudrait que tu montres le script complet. Tu peux énormément simplifier cette boucle
#On va compter le nbre de ligne pour initialiser une boucle
NB_LIGNE=`cat $tmp2 | wc -l`
echo "Initialisation d'une boucle afin de pouvoir lire ligne par ligne le fichier formaté:"
j=1
while [ $j -le $NB_LIGNE ]
do
#Lis le contenu du fichier formater, l'option sed ici va lire ligne par ligne
cat $tmp2 | sed -n "$j"p > $tmp
if [ -s $tmp ] #Le fichier existe et n'est pas vide
then
Date=`cat $tmp2 | sed -n "$j"p | awk -F" " '{print $1}'`
BP=`cat $tmp2 | sed -n "$j"p | awk -F" " '{print $2}'`
VHex=`cat $tmp2 | sed -n "$j"p | awk -F" " '{print $3}'`
BillDist=`cat $tmp2 | sed -n "$j"p | awk -F" " '{print $4}'`
IDHex=`cat $tmp2 | sed -n "$j"p | awk -F" " '{print $5}'`
VDecimal=`echo $((16#$VolumeHex))`
IDDecimal=`echo $((16#$PLMNIDHex))`
echo ""$Date;""$BP;""$VDecimal;""$BillDist;""$IDDecimal;"" >> $analyse_cra
else
echo "Erreur"
fi
echo "Traitement de la ligne $j terminé"
j=`expr $j + 1`
done
en la remplaçant par
while read ligne
do
if [ -s "$ligne" ] #La ligne existe et n'est pas vide
then
Date=$(awk '{print $1}' <<<"$ligne")
BP=$(awk '{print $2}' <<<"$ligne")
......................................................................
VDecimal=$((16#$VolumeHex))
IDDecimal=$((16#$PLMNIDHex))
echo ""$Date;""$BP;""$VDecimal;""$BillDist;""$IDDecimal;"" >> $analyse_cra
else
echo "Erreur"
fi
done <"$tmp2"
Édité : Correction
Dernière modification par pingouinux (Le 10/10/2016, à 17:46)
Hors ligne
#7 Le 11/10/2016, à 07:43
- serged
Re : Script Stop - Commandes Unix Stop
salut,
tu peux toujours kill une commande "en cours".
kill $(pidof -x tonScript) #ou kill $(pgrep tonScript)
si ça ne suffit pas, tu peux indiquer le signal à envoyer au script pour le tuer (voir kill -l).
plus simple :
killall nom-du-script
LinuxMint Vera Cinnamon et d'autres machines en MATE, XFCE... 20.x , 21.x ou 19.x
Tour : Asus F2A55 / AMD A8-5600K APU 3,6GHz / RAM 16Go / Nvidia GeForce GT610 / LM21.1 Cinnamon
Portable : LDLC Mercure MH : Celeron N3450 /RAM 4Go / Intel HD graphics 500 i915 / biboot Win 10 (sur SSD) - LM21.1 MATE (sur HDD)
Hors ligne
#8 Le 11/10/2016, à 17:14
- Beuhlet_Reseau
Re : Script Stop - Commandes Unix Stop
Bonjour,
Il faudrait que tu montres le script complet. Tu peux énormément simplifier cette boucle#On va compter le nbre de ligne pour initialiser une boucle NB_LIGNE=`cat $tmp2 | wc -l` echo "Initialisation d'une boucle afin de pouvoir lire ligne par ligne le fichier formaté:" j=1 while [ $j -le $NB_LIGNE ] do #Lis le contenu du fichier formater, l'option sed ici va lire ligne par ligne cat $tmp2 | sed -n "$j"p > $tmp if [ -s $tmp ] #Le fichier existe et n'est pas vide then Date=`cat $tmp2 | sed -n "$j"p | awk -F" " '{print $1}'` BP=`cat $tmp2 | sed -n "$j"p | awk -F" " '{print $2}'` VHex=`cat $tmp2 | sed -n "$j"p | awk -F" " '{print $3}'` BillDist=`cat $tmp2 | sed -n "$j"p | awk -F" " '{print $4}'` IDHex=`cat $tmp2 | sed -n "$j"p | awk -F" " '{print $5}'` VDecimal=`echo $((16#$VolumeHex))` IDDecimal=`echo $((16#$PLMNIDHex))` echo ""$Date;""$BP;""$VDecimal;""$BillDist;""$IDDecimal;"" >> $analyse_cra else echo "Erreur" fi echo "Traitement de la ligne $j terminé" j=`expr $j + 1` done
en la remplaçant par
while read ligne do if [ -s "$ligne" ] #La ligne existe et n'est pas vide then Date=$(awk '{print $1}' <<<"$ligne") BP=$(awk '{print $2}' <<<"$ligne") ...................................................................... VDecimal=$((16#$VolumeHex)) IDDecimal=$((16#$PLMNIDHex)) echo ""$Date;""$BP;""$VDecimal;""$BillDist;""$IDDecimal;"" >> $analyse_cra else echo "Erreur" fi done <"$tmp2"
Édité : Correction
Merci pour ton aide pingouin. Mon objectif a quelque peu changé depuis. En effet mon fichier faisant plusieurs millions de lignes le traitement que j'avais pensé est trop lent.
Du coup voici comment je me réoriente :
[ -f $tmp ] && rm -f $tmp
[ -f $tmp2 ] && rm -f $tmp2
jour=$(date +%Y%m%d)
heure2ago=$(date +%H -d '2 hour ago')
zcat /TM/data/lisible/D$jour$heure2ago*.gz | awk -F "|" '{print $14,$22,$31,$33}' > $tmp
Mon fichier obtenu est le suivant :
LEGACY_ 017AA0 01 0000005141
LEGACY_DCB_ 01FA73 01 0000005141
LEGACY__ENT 7D6B 01 0000005141
LEGACY_ 2F4E 01 000000EBF0
LEGACY_DCB_ 020595E8 01 0000005141
LEGACY__ENT 0132 01 0000005141
LEGACY__ENT 010E31 01 0000005141
LEGACY_ 1D68 01 000000665A
Mon objectif est :
Additionner tous les champs $2 qui sont en hexadécimal pour ensuite les transformer (avant ou après) en décimal.
Je préfère travailler directement sur le fichier pour éviter de devoir utiliser des fichier temps car le traitement est énormément long dû à ce type de langage non compilé.
Mon idée :
Je déclare une variable au début style :
Vtotalhex=0 (qui vas nous servir de base pour additionner)
Et au niveau code :
while read ligne tmp;do
awk -F " " '{$Vtotalhex+$2}'
done
echo $Vtotalhex
=> FFFFxxxxFFF
Donc notre valeur Vtotalhex à 0 au début se retrouve après ce traitement à une valeur correspondante à la somme de tous les champs $2 en hexadecimal. Après pour transformer la valeur total en hex vers du décimal j'ai pensé à ceci :
Vtotaldec=`echo $((16#$Vtotalhex))`
Dernière modification par Beuhlet_Reseau (Le 11/10/2016, à 17:15)
L'avenir appartient à ceux qui se lèvent tôt... Pas ceux qui crachent trop (vite?).
Hors ligne
#9 Le 11/10/2016, à 19:37
- pingouinux
Re : Script Stop - Commandes Unix Stop
Essaye ceci :
Vtotaldec=0
while read a1 a2 a3
do
Vtotaldec=$(( Vtotaldec + $((16#$a2)) ))
done <fichier
printf "Vtotalhex => %x Vtotaldec => %d\n" $Vtotaldec $Vtotaldec
Donne ceci sur ton exemple en #8 :
Vtotalhex => 20ae47f Vtotaldec => 34268287
Ajouté : Autre façon de faire, en utilisant un tableau
Vtotaldec=0
while read -a a
do
Vtotaldec=$(( Vtotaldec + $((16#${a[1]})) ))
done <fichier
printf "Vtotalhex => %x Vtotaldec => %d\n" $Vtotaldec $Vtotaldec
Dernière modification par pingouinux (Le 12/10/2016, à 07:57)
Hors ligne
#10 Le 13/10/2016, à 11:25
- Beuhlet_Reseau
Re : Script Stop - Commandes Unix Stop
Ok merci beaucoup pingouin.
J'ai décidé pour accéléré le traitement de tout formater dans le awk du début qui récupère les informations. :
Anciennement :
awk -F "|" '{print $9,$14,$22,$31,$33}' $tmp
Nouveau code
awk -F "|" '{print $14,$22,$31,$33}'| awk -F " " '{gsub($2,$2=strtonum("0x"$2),$2);print $0}' | awk -F " " '{gsub($4,$4=strtonum("0x"$4),$4);print $0}' > $tmp
Donc je passe de ceci :
LEGACY_ 017AA0 01 0000511
LEGACY_DCB_ 01FA73 01 0000514
LEGACY__ENT 7D6B 01 0000514
LEGACY_ 2F4E 01 0000EF0
à Ceci :
_ENT 102133 01 2081
LEGACY_191526 01 60401
__ENT 203336 01 208
__ENT 377 01 25401
Plutôt pas mal. Du coup pour calculer la valeur total de la colonne 2 (qui est maintenant en décimal) se résume à cette commande :
#Donne le nombre total d'octets du champs 2 :
Nbr_total_octet=`cat $tmp | gawk -F" " '{volumTOT+=strtonum($2);}'
Ce que je voudrais faire la c'est ok on a le nombre total d'octets global. Mais je tiens un fichier par zone résidentiel sous la forme :
cat Zone_Residentiel
1A;208
1A;2081
1B;286
1B;603
1B;604
1B;604
1C;259
1C;254
1C;274
Je travail sur un rendu sous la forme suivante :
#Donne le nombre total d'octets global :
Nbr_total_octet=`cat $tmp | gawk -F" " '{volumTOT+=strtonum($2);}'
#Donne le nbr total d'octets de la zone 1A =`cat $tmp | gawk -F" " '{print $2}' | egrep $2 Zone_residentiel | if [$2 -F Zone_Residentiel] | ZoA = $2+
#Donne le nbr total d'octets de la zone 1B =`cat $tmp | gawk -F" " '{print $2}' | egrep $2 Zone_residentiel | if [$2 -F Zone_Residentiel] | ZoA = $2+
#Donne le nbr total d'octets de la zone 1C =`cat $tmp | gawk -F" " '{print $2}' | egrep $2 Zone_residentiel | if [$2 -F Zone_Residentiel] | ZoA = $2+
Comme résultat espéré :
le nombre total d'octets global : 200 Go
le nombre total doctets de la zone 1A = 40 Go
le nombre total d'octets de la zone 1B = 30 Go
[...]
L'avenir appartient à ceux qui se lèvent tôt... Pas ceux qui crachent trop (vite?).
Hors ligne
#11 Le 13/10/2016, à 17:14
- pingouinux
Re : Script Stop - Commandes Unix Stop
Pour info, pour ta deuxième commande en #10, tu peux remplacer:
.......... | awk -F " " '{gsub($2,$2=strtonum("0x"$2),$2);print $0}' | awk -F " " '{gsub($4,$4=strtonum("0x"$4),$4);print $0}' > $tmp
par
.......... | awk '{gsub($2,strtonum("0x"$2),$2);gsub($4=strtonum("0x"$4),$4);print $0}' > $tmp
Pour le reste, je n'ai pas compris ce que tu voulais faire. Donne éventuellement un petit exemple précis (fichier de départ, fichier d'arrivée).
Hors ligne
#12 Le 17/10/2016, à 17:43
- Beuhlet_Reseau
Re : Script Stop - Commandes Unix Stop
Super grâce à un peu de recherche croisée avec vos réponses j'ai finalement réussi ma manipulation !
Merci à la communauté.
Dernière chose c'est incroyable mais je bloque sur des opérations simples sur mes variables.
Explication :
VolumeOctet_ZoneA=68497298 #(octets)
PrixMegaoctet=0,2 #(€)
###Notre volume est en octet et le prix se compte au MegaOctet
PrixtotalzoneA = `expr $VolumeOctet_ZoneA /1024/1024 *$PrixMegaoctet`
expr: syntax error
PrixtotalzoneA = $(($VolumeOctet_ZoneA /1024/1024 * $PrixMegaoctet))
echo $PrixtotalzoneA
2
=> Le résultat devrait être 13 (68497298/1024/1024 * 0,2 = 13)
Vous avez une idée ?
L'avenir appartient à ceux qui se lèvent tôt... Pas ceux qui crachent trop (vite?).
Hors ligne
#13 Le 17/10/2016, à 18:34
- pingouinux
Re : Script Stop - Commandes Unix Stop
Bonjour,
VolumeOctet_ZoneA=68497298 #(octets)
PrixMegaoctet=0.2 #(€)
PrixtotalzoneA=$(bc <<<"$VolumeOctet_ZoneA /1024/1024 * $PrixMegaoctet")
Ajouté :
Et si tu veux des décimales
PrixtotalzoneA=$(bc <<<"scale=3; $VolumeOctet_ZoneA /1024/1024 * $PrixMegaoctet")
Dernière modification par pingouinux (Le 17/10/2016, à 19:18)
Hors ligne