Contenu | Rechercher | Menus

Annonce

Si vous avez des soucis pour rester connecté, déconnectez-vous puis reconnectez-vous depuis ce lien en cochant la case
Me connecter automatiquement lors de mes prochaines visites.

À propos de l'équipe du forum.

#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

Watael a écrit :

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

pingouinux a écrit :

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