Ordre d'execution des commandes dans un script

Ordre d'execution des commandes dans un script - Codes et scripts - Linux et OS Alternatifs

Marsh Posté le 10-04-2003 à 09:19:47    

J'ai un script qui grosso merdo fais ceci:
 

Code :
  1. petit_programme --parametre > fichier_de_destination
  2. if test -s fichier_de_destination
  3. then
  4. cat fichier_de_destination | mail -s "rapport" bidule@domaine.com
  5. fi


 
Le but est que le petit_programme me génère un fichier texte qui est ensuite envoyé par mail si il n'est pas vide.
La taille du fichier texte généré varie entre 0 et 30 ko et petit_programme met une vingtaine de seonde à s'éxécuter.
 
Mon souci est que lorsque ce script est executer il trouve en général que la taille du fichier_de_destination est nul alors que si je la regarde par un ls -l elle est non nulle. Du coup le mail n'est pas envoyé alors qu'il devrais.
 
Si j'execute le script ligne par ligne à la main il fonctionne.
 
D'ou ma question. Avant de passer à la ligne suivante du script est ce que çà attend que la ligne en cours soit complètement exécutée? en clair vu que petit_programme met une vingtaine de seconde à s'éxécuter , est-ilpossible que le test sur la taille u fichier généré se fasse avant la fin de l'exécution de peti_programme ?
 
Merci de votre aide.
Sorg

Reply

Marsh Posté le 10-04-2003 à 09:19:47   

Reply

Marsh Posté le 10-04-2003 à 09:26:27    

c possible.
mais un sleep 30 dans ton script après l'éxécution de ton prog pour tester.
après il y a surement des solutions plus "propres", avec wait peut-être

Reply

Marsh Posté le 10-04-2003 à 09:28:27    

Oui j'ai pensé au sleep. Ca me parait une bonne idée mais un peu crados car il y a plusieurs centaines d'exemplaire de ce script lancé à heure fixe par cron. Déjà que c lent , il me parait important d'économiser chaque seconde.

Reply

Marsh Posté le 10-04-2003 à 09:29:45    

je rencontre de tps à autre ce genre de prb avec mes programmes perl
 
c'est à mon sens un problème de buffer, ton prog garde en mémoire les données qu'il doit écrire dans ton fichier de destination mais prend son temps pour les écrire, trop de temps a priori car la commande suivante est exécutée avant que les données ne soient écrites
 
c'est possible de faire du fflush ou du autoflush dans un script shell ?


---------------
Samsung Galaxy S1 -> Samsung Galaxy S2 -> Samsung Note 2 -> Huawei Ascend Mate 7 -> ZTE Axon 7 -> OnePlus 6T -> Oppo Find X2 PRO
Reply

Marsh Posté le 10-04-2003 à 09:31:35    

Je connais pas ces commandes. Ca fait quoi ?

Reply

Marsh Posté le 10-04-2003 à 09:34:43    

Sorg a écrit :

Je connais pas ces commandes. Ca fait quoi ?

ben, fflush c'est pour le C et autoflush pour Perl, ça force les buffers d'un prog à écrire les données dans les fichiers à chaque fois que le prog doit les écrire, ce qui fait qu'il ne les bufferise plus
 
tu veux pas filer ton code complet que je te ponde le script Perl correspondant (du - je v essayer) ?


---------------
Samsung Galaxy S1 -> Samsung Galaxy S2 -> Samsung Note 2 -> Huawei Ascend Mate 7 -> ZTE Axon 7 -> OnePlus 6T -> Oppo Find X2 PRO
Reply

Marsh Posté le 10-04-2003 à 10:18:10    

Aricoh a écrit :


c'est possible de faire du fflush ou du autoflush dans un script shell ?

man sync

Reply

Marsh Posté le 10-04-2003 à 11:52:30    

Linux n'écrit pas immédiatement les infos sur le disque mais je ne pensais pas que ça pouvait engendrer des erreurs dans ce genre  :heink:
 
Une autre solution :
 
toto="`petit_programme --parametre`"
[ -n "$toto" ] && echo "$toto" | mail -s "rapport" bidule@domaine.com

Reply

Marsh Posté le 10-04-2003 à 13:43:21    

Aricoh a écrit :

ben, fflush c'est pour le C et autoflush pour Perl, ça force les buffers d'un prog à écrire les données dans les fichiers à chaque fois que le prog doit les écrire, ce qui fait qu'il ne les bufferise plus
 
tu veux pas filer ton code complet que je te ponde le script Perl correspondant (du - je v essayer) ?


 

Code :
  1. #!/bin/sh
  2. ~vpopmail/tmda/bin/tmda-pending -c /charity/mail/domains/charityemail.net/sorg/.tmda/config -Cbs > /etc/cron.mail/.sorg@charityemail.net
  3. if test -s .sorg@charityemail.net
  4. then
  5. cat .sorg@charityemail.net |/bin/mail -s "Filtering report : `date +%d-%m-%Y`" sorg@charityemail.net
  6. fi
  7. /charity/mail/tmda/bin/tmda-pending -c /charity/mail/domains/charityemail.net/sorg/.tmda/config -q -b -d -O 32d


 
Voilà le script actuel. (Par contre il y a des retours de chariots un peu partout qui se sont foutu alors j'ai séparé chaque ligne par une ligne blanche.)


Message édité par sorg le 10-04-2003 à 13:45:10
Reply

Marsh Posté le 10-04-2003 à 14:36:39    

et si tu met #!/usr/bin/bash au lieu de #!/bin/sh.
Ca donne quoi?


---------------
A Plus Donc...  [:jls]
Reply

Marsh Posté le 10-04-2003 à 14:36:39   

Reply

Marsh Posté le 10-04-2003 à 17:58:22    


Le problème vient tout simplement du fait que tu vérifie
 
if test -s fichier_de_destination  
 
et non pas if test -s /path/to/fichier_de_destination

Reply

Marsh Posté le 10-04-2003 à 18:40:07    

tu est sur de çà ? parce que si j'execute ligne par ligne çà fonctionne.
 
Edit: Si je vire le test est que je fais envoyer le mail systématiquement après la génération du fichier, je recois un mail vide alors que le fichier contient bien qqch. Je tendrais donc plutot à croire l'autre hypothèse: celle de l'histoire des buffers.


Message édité par sorg le 10-04-2003 à 18:42:08
Reply

Marsh Posté le 10-04-2003 à 18:42:26    

ArSuniK a écrit :

Linux n'écrit pas immédiatement les infos sur le disque mais je ne pensais pas que ça pouvait engendrer des erreurs dans ce genre  :heink:
 
Une autre solution :
 
toto="`petit_programme --parametre`"
[ -n "$toto" ] && echo "$toto" | mail -s "rapport" bidule@domaine.com
 


 
Marche pas  :??:

Reply

Marsh Posté le 10-04-2003 à 18:48:28    

Ben oui, ca me parait tout à fait logique.
 
En test : envoye le résultat de $(ls) plutot que le contenu du fichier pour t'en convaincre.

Reply

Marsh Posté le 10-04-2003 à 18:57:44    

becket a écrit :

Ben oui, ca me parait tout à fait logique.
 
En test : envoye le résultat de $(ls) plutot que le contenu du fichier pour t'en convaincre.


 
Je viens de tester , le 'ls' me renvoie une taille non nulle.

Reply

Marsh Posté le 11-04-2003 à 09:35:47    

Finalement je fais çà:
 

Code :
  1. #!/bin/sh
  2. toto="`~vpopmail/tmda/bin/tmda-pending -c /charity/mail/domains/charityemail.net/sorg/.tmda/config -Cbs`"
  3. echo sorg@charityemail.net
  4. if [ "$toto" = "" ]
  5. then
  6. echo Pas de mails en attente
  7. else
  8. echo "$toto" |/bin/mail -s "Filtering report : `date +%d-%m-%Y`" sorg@charityemail.net
  9. echo rapport envoyé
  10. fi


 
Et çà marche! Merci à tous

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed