IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Linux Discussion :

Script périodique d'insertion et fichier FIFO (Pour base de données)


Sujet :

Linux

  1. #1
    Membre à l'essai
    Inscrit en
    Juillet 2005
    Messages
    45
    Détails du profil
    Informations forums :
    Inscription : Juillet 2005
    Messages : 45
    Points : 24
    Points
    24
    Par défaut Script périodique d'insertion et fichier FIFO (Pour base de données)
    Bonjour,

    Sur une distribution RedHat 4AS, j’ai installé le serveur de fax HylaFax (version 4.3.0) et MySQL (version 4.1.7).

    Par défaut HylaFax ne permet pas de connexion directe à MySQL, pour y insérer les informations comme les fax envoyés ou les fax reçus.

    Pour HylaFax

    La visualisation des fax envoyé se fait par la commande :
    La visualisation des fax reçus se fait par la commande :
    Format de retour:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    HylaFAX scheduler on serveur_fax: Running
    ttyS1   53      Running and idle        *
    ttyS0   55      Waiting for modem to come ready
     
    JID  S           Owner Number          Pages Dials Prior     TTS Status
    21   D            root 53               1:1   1:12   127
    31   D            root 53               1:1   1:12   127
    35   D            root 53               1:1   1:12   127
    Pour insérer le résultat de ces commandes dans ma base de données MySQL, j’ai écris un script shell qui insert le résultat de la commande dans un fichier texte, puis qui importe le contenu de ce fichier texte dans ma base de donnée (script exécuté en tant que root, mais la commande faxstat -r et lancé par l’utilisateur srvfax)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    # insertion dans mysql des informations de faxstat -r
    su srvfax -c 'faxstat -r > phpfax_recvq'
    mysqlimport -d -L --fields-optionally-enclosed-by='"' --ignore-lines=5 phpfax phpfax_recvq
    (Idem pour les autres commandes)

    Manuellement, tout fonctionne correctement.

    Dans un premier temps, je souhaiterais automatiser l’exécution de se script. C'est-à-dire qu’il se lance au démarrage du serveur (à la manière d’un service) et qu’il s’exécute toutes 10 secondes, pour contrôler l’arrivée ou l’envoi de fax et les insérer dans la BDD.

    J’ai d’abord pensé à créer une boucle infini avec un sleep, le problème c’est que même lancé en arrière plan, le script bouffe toute mes ressources (pourtant il fait pas grand-chose !!!) et ça ne me semble pas très propre comme méthode !!!

    Ensuite j’ai pensé au cron, mais, si je ne me trompe pas, cron ne permet d’exécuter un script qu’au minimum toutes les minutes.

    Quelle solution me conseillez vous ?



    Je cherche également à rendre ce script plus propre, plus professionnel … J’utilise par exemple autant de fichier texte (fichiers tampons) que de commandes de fax

    Ex :
    une commande pour la visu des fax envoyés == un fichier texte
    une commande pour la visu des fax reçus == un fichier texte
    Pour le moment ces fichiers ne font que quelques kilos, mais dans quelques temps plus il y aura de fax reçus ou envoyés plus ces fichiers seront gros.

    J’ai donc pensé passer par un fichier « FIFO nommé » que j’ai créé avec les commandes :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    mkfifo FIFO.hylafax.mysql
    chmod 666 FIFO.hylafax.mysql
    Quand j’essaie d’insérer le résultat de ma commande faxstat –r dans le fichier FIFO

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Faxstat -r > FIFO.hylafax.mysql
    Le shell ne me rend pas la main !!

    D’où vient mon erreur ?



    En résumer comment puis je lancer ce script au démarrage (Il faut créer un script dans /etc/rc.d/init.d me semble-t-il) qu’il s’exécute toutes les 10 secondes (en tenant compte du cas où MySQL ou le serveur de fax s’arrêteraient) et éviter de passer par des fichiers textes « tampons »

    D’avance merci pour votre aide et vos conseils

    Fred

    PS: Désolé si le titre n'est pas trés explicite

  2. #2
    Expert éminent sénior Avatar de frp31
    Homme Profil pro
    Ingénieur systèmes et réseaux
    Inscrit en
    Juillet 2006
    Messages
    5 196
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur systèmes et réseaux
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Juillet 2006
    Messages : 5 196
    Points : 12 264
    Points
    12 264
    Par défaut
    le plus simple pour qu'il demarre comme un service et s'execute toutes les 30 secondes ou 10 ....

    tu ajoutes a la fin du script tu ajoute une ligne dans /etc/inittab style

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    bidule:1234:respawn:/usr/sbin/tonscript
    ne pas oublier de faire un quand tu edites le fichier inittab pour prendre en charge dynamiquement les changements (sans aller redemarrer les services)

    inittab fait parti des services minimums indispensables il est donc forcément actif..


    -----------


    pour ta question sur le fichier fifo je sais pas normalement ta methode est LA bonne

    si ton soft de fax la gere mal c'est pas ta faute.

  3. #3
    Membre à l'essai
    Inscrit en
    Juillet 2005
    Messages
    45
    Détails du profil
    Informations forums :
    Inscription : Juillet 2005
    Messages : 45
    Points : 24
    Points
    24
    Par défaut
    Citation Envoyé par frp31
    pour ta question sur le fichier fifo je sais pas normalement ta methode est LA bonne

    si ton soft de fax la gere mal c'est pas ta faute.
    Le problème ne semble pas venir des commandes du soft.

    Lorsque je fais un simple test avec un fichier texte, le résultat est le même.

    Exemple avec un fichier texte toto.txt qui contient la phrase "Hello World"

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    toto.txt  > FIFO.hylafax.mysql
    ou encore si je fais un echo

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    echo Hello World > FIFO.hylafax.mysql
    Le shell ne me rend pas le prompt ... il semble attendre quelque chose !

    Finallement, n'est-il pas préférable que j'utilise un tube | plutôt qu'un fichier FIFO nommé ?

    J'étais parti sur l'idée du fichier FIFO, d'aprés ce que j'avais lu dans la doc de MySQL: 13.1.5. Syntaxe de LOAD DATA INFILE

    Citation Envoyé par 13.1.5. Syntaxe de LOAD DATA INFILE
    Si vous avez besoin de lire des données LOAD DATA depuis un pipe, vous devez utiliser la technique suivante :

    mkfifo /mysql/db/x/x
    chmod 666 /mysql/db/x/x
    cat < /dev/tcp/10.1.1.12/4711 > /mysql/db/x/x
    mysql -e "LOAD DATA INFILE 'x' INTO TABLE x" x

    Si vous utilisez une version de MySQL plus ancienne que 3.23.25, vous pouvez uniquement utiliser cette technique avec LOAD DATA LOCAL INFILE.

    Si vous utilisez une version de MySQL antérieure à la 3.23.24 vous ne pouvez lire à partir d'un FIFO avec LOAD DATA INFILE. Si vous avez besoin de lire à partir d'un FIFO (par exemple la sortie de gunzip), utilisez LOAD DATA LOCAL INFILE.
    Mon problème si je passe par un tube, c'est que je ne vois absolument pas comment combiner mes deux commandes
    • faxstat -r
    • mysqlimport [options] database textfile1 [textfile2 ...]

    Comment réunir ces deux commandes en une seule ?

  4. #4
    Membre chevronné

    Profil pro
    Inscrit en
    Mars 2004
    Messages
    1 296
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2004
    Messages : 1 296
    Points : 1 803
    Points
    1 803
    Par défaut
    Ton "erreur" sur le fichier FIFO n'est pas une erreur : c'est un comportement tout a fait normal.

    Un fichier fifo (first in first out) est bloquant ! si tu ecrit dedans avant lecture il restera bloquer jusqu' a la lecture. Si tu lis avant lecture il restera bloquer jusqu'a ecriture .


    donc tu lance ton script est celui ci attendra la lecture par le loader mysql. pour ne pas etre bloquer soit 2 script (a synchroniser) soit l'ecriture en tache de fond (un & a la fin de la commande).

  5. #5
    Membre à l'essai
    Inscrit en
    Juillet 2005
    Messages
    45
    Détails du profil
    Informations forums :
    Inscription : Juillet 2005
    Messages : 45
    Points : 24
    Points
    24
    Par défaut
    Citation Envoyé par MarcG
    Ton "erreur" sur le fichier FIFO n'est pas une erreur : c'est un comportement tout a fait normal.

    Un fichier fifo (first in first out) est bloquant ! si tu ecrit dedans avant lecture il restera bloquer jusqu' a la lecture. Si tu lis avant lecture il restera bloquer jusqu'a ecriture .


    donc tu lance ton script est celui ci attendra la lecture par le loader mysql. pour ne pas etre bloquer soit 2 script (a synchroniser) soit l'ecriture en tache de fond (un & a la fin de la commande).
    Effectivement comme ça, ça fonctionne ...

    J'ai testé avec:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    [root]# echo "Hello World" > FIFO.hylafax.mysql &
    [1] 6002
    [root]#
    [root]# more FIFO.hylafax.mysql
    Hello World
    [1]+  Done                    echo "Hello World" >FIFO.hylafax.mysql
    [root]#
    Je comprends donc mieux d'où venait mon problème.

    Je suppose donc qu'il y a une erreur de syntaxe dans les explications de la doc MySQL:

    13.1.5. Syntaxe de LOAD DATA INFILE a écrit :
    Si vous avez besoin de lire des données LOAD DATA depuis un pipe, vous devez utiliser la technique suivante :

    mkfifo /mysql/db/x/x
    chmod 666 /mysql/db/x/x
    cat < /dev/tcp/10.1.1.12/4711 > /mysql/db/x/x &
    mysql -e "LOAD DATA INFILE 'x' INTO TABLE x" x
    Dans mon script mes commandes seront donc:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    su srvfax -c 'faxstat -d > FIFO.hylafax.mysql' &
    mysql -e "LOAD DATA LOCAL INFILE 'FIFO.hylafax.mysql' IGNORE INTO TABLE phpfax.phpfax_doneq FIELDS OPTIONALLY ENCLOSED BY '\"' IGNORE 5 LINES"
    En ligne de commande ça fonctionne correctement, je voudrais maintenant savoir si cette syntaxe ne peut pas être améliorée, voir réduite en une seule ligne (certains vont peut être me dire: on s'en fou puisque ça marche LOL)

    Voilà mon script global pour lancer et/ou arrêter la procédure de mise à jour:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    #!/bin/bash
     
    ###################################################
    # description: hylafax2mysql est un script qui execute la mise  a jour d'une
    # base de donnees MySQL via les commandes 
    # faxstat -r; faxstat -d; faxstat -s etc ... du serveur de fax
    #
    # lockfile: /tmp/hylafax2mysql.lock                                                          
    # processname: hylafax2mysql   
    #
    # Date de creation : 11/10/2006
    # Derniere modif   :12/10/2006
    ####################################################
     
    set -o noclobber
     
    NAME=hylafax2mysql
    LOCK=/tmp/$NAME.lock
     
    SANS_ARGS=0
    E_ERREUROPTION=65
     
    debut () {
         if [ -f "$LOCK" ]
         then
           error "Le deamon $NAME est deja en cours d'execution !"
         else
           echo -n '' > "$LOCK" || error "Impossible d'ecrire $LOCK"
           echo -n "Demarrage de $NAME... "
           demarre &
           echo $! >> "$LOCK"
           echo "OK (pid=$!)"
         fi
    }
     
    fin () {
     
         if [ -f "$LOCK" ]
         then
           PID=$(cat "$LOCK")
           case "$PID" in [1-9][0-9]*) ;; *) error "$LOCK ne contient pas de pid";; esac
     
           echo -n "Arret de $NAME... "
           if kill -KILL "$PID"
           then
             echo "OK (pid=$PID)"
             rm "$LOCK"
           else
             echo "Le processus $PID n'est pas en cours d'execution (nettoyage de  $LOCK)!" 1>&2
             rm "$LOCK"
             exit 1
           fi
         else
           error "Le daemon $NAME n'est pas demarre"
         fi
    }
     
    error () {
      echo "$1" 1>&2
      exit 1
    }
     
    traitement () {
      if [ -f "$LOCK" ]
      then
      # insertion dans mysql des informations de faxstat -d
        su srvfax -c 'faxstat -d > FIFO.hylafax.mysql' &
        mysql -e "LOAD DATA LOCAL INFILE 'FIFO.hylafax.mysql' IGNORE INTO TABLE phpfax.phpfax_doneq FIELDS OPTIONALLY ENCLOSED BY '\"' IGNORE 5 LINES"
      fi
    }
     
    demarre () {
      while true
      do
        if sleep $arg
        then traitement
        else exit 1
        fi
      done
    }
     
    usage () {
        error "Usage: $0 options [ -dsrh] "
    }
     
    if [ $# -eq "$SANS_ARGS" ]  
    then
      usage
      exit $E_ERREUROPTION 
    fi
     
    while getopts d:sr:h argument
    do
            case $argument in
            d)
              arg=$OPTARG
              debut
              ;;
     
              s)
               fin
               ;;
     
               r)
               arg=$OPTARG
               fin
               debut
               ;;
     
               h)
               echo "Fichier d'aide en cours d'ecriture"
               ;;
     
               :) 
                echo "l'option -$OPTARG a besoin d'un argument " ; exit ;;
     
               *) usage
            esac
     
    done
    Ce script se lance avec comme paramétre la durée en seconde entre chaque mise à jour via l'option -d
    Il s'arrête avec l'option -s
    et se redemarre avec l'option -r
    Ce script fonctionne bien, mais voyez vous des choses à modifier/perfectionner, ou des erreurs dans le code ?

Discussions similaires

  1. Réponses: 9
    Dernier message: 10/04/2015, 15h01
  2. Insertion de fichiers dans une base de données sql server
    Par stefsas dans le forum Accès aux données
    Réponses: 1
    Dernier message: 30/06/2010, 20h22
  3. Fichier .dmp pour base de donnée Mysql
    Par 8itit dans le forum Import/Export
    Réponses: 2
    Dernier message: 29/04/2010, 15h54
  4. [MySQL] utilisé un fichier XML pour stocker des données ?
    Par italiasky dans le forum PHP & Base de données
    Réponses: 2
    Dernier message: 05/05/2007, 11h04
  5. Parametre dans fichier ini pour base fractionnée
    Par sunvialley dans le forum Access
    Réponses: 5
    Dernier message: 28/07/2006, 14h38

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo