[Perl] script utilisant les pipe unix, sql, et p'tet fork

script utilisant les pipe unix, sql, et p'tet fork [Perl] - Perl - Programmation

Marsh Posté le 23-10-2006 à 18:41:04    

Bonjour à tous.
 
Ma question est plus algorithmique que pratique on va dire.
Ce n'est pas tant l'écriture du perl qui me bloque mais plutôt l'architecture du script.
 
Je vous pose le problème.
 
But du script
 
Un serveur reçoit un message syslog qui est stocké dans un pipe unix.
Je souhaiterais récupérer ce message et l'insérer dans une base de données.
Aujourd'hui je le fais sans soucis mais à chaque message reçu je fait une connexion BDD et une cloture de connexion ce qui me déplairait si je devais recevoir énormément de messages en très peu de temps.
J'ai un autre moyen ce serait d'ouvrir une connexion BDD au lancement du script et balancer les données dedans au fur et a mesure sans jamais fermer la connexion : le problème :  
- je ne sais pas au bout de combien de temps la connexion à la bdd time out et comme je peut très bien recevoir 50 messages en une minute, je peux très bien n'en recevoir aucun pendant plusieurs heures.
 
A savoir, la lecture du pipe unix est bloquant jusqu'a ce que quelque chose redirige du texte (dans mon cas) dans ce pipe.
 
Ce que je souhaite faire
 
Le top serait de lancer un compteur au début du script qui clos et re effectue la connexion à la bdd toutes les X minutes.
Et pendant ce laps de temps je peux faire toutes les requetes que je veux.
Je pensais forker le script pour que le processus bloquant ne joue pas sur le compteur de temps mais comment faire en sorte que le processus bloquant recoit les paramètres de connexion a la bdd lorsque celle ci est cloturée, relancée.
 
en gros je cherche a faire communiquer 2 processus pour que l'un recupère la variable lui permettant d'envoyer ces commandes sql dans la bonne connexion BDD.
 
Vous avez une soluce ?
 
PS : p'tet que fork n'est pas la meilleure solution mais il me viens que ca en tête

Message cité 1 fois
Message édité par tifrere le 23-10-2006 à 18:41:56
Reply

Marsh Posté le 23-10-2006 à 18:41:04   

Reply

Marsh Posté le 01-11-2006 à 05:03:23    

Pourquoi veux-tu que ca timeout ? Quand tu lances le shell de ta bdd, il reste, même si tu ne tapes rien pendant des années. C'est pareil à travers un pipe.

Reply

Marsh Posté le 01-11-2006 à 06:48:09    

Solution: un cronjob qui tue le script toutes les x minutes.

Reply

Marsh Posté le 07-03-2007 à 20:35:18    

Si tu es sous Unix et CDE, tu devrais plutôt utiliser un script dtksh, avec la routine XtAddInput notamment, qui permet d'intercepter en temps réel tout ce qui passe par le pipe et en déclencher le traitement nécessaire, le tout cadencé par l'horloge X du système, sans effort ni blocage.
Voici le squelette d'un tel script, qui ne prend que quelques lignes :
 
-------------------------------
 
#!/usr/dt/bin/dtksh
 
function Traitement  {
 
  # Exemple
 
   read
 
   if [[ ${REPLY} ]]
   then
            print ${REPLY}  >> /tmp/logfile_$$
   else
            print "Pipe broken"  >> /tmp/logfile_$$
            exit 1
   fi
}
 
# Main
 
XtAddInput STDINPUT -r 0 Traitement
 
XtMainLoop
 
-----------------------------------------------
 
}

tifrere a écrit :

Bonjour à tous.
 
Ma question est plus algorithmique que pratique on va dire.
Ce n'est pas tant l'écriture du perl qui me bloque mais plutôt l'architecture du script.
 
Je vous pose le problème.
 
But du script
 
Un serveur reçoit un message syslog qui est stocké dans un pipe unix.
Je souhaiterais récupérer ce message et l'insérer dans une base de données.
Aujourd'hui je le fais sans soucis mais à chaque message reçu je fait une connexion BDD et une cloture de connexion ce qui me déplairait si je devais recevoir énormément de messages en très peu de temps.
J'ai un autre moyen ce serait d'ouvrir une connexion BDD au lancement du script et balancer les données dedans au fur et a mesure sans jamais fermer la connexion : le problème :  
- je ne sais pas au bout de combien de temps la connexion à la bdd time out et comme je peut très bien recevoir 50 messages en une minute, je peux très bien n'en recevoir aucun pendant plusieurs heures.
 
A savoir, la lecture du pipe unix est bloquant jusqu'a ce que quelque chose redirige du texte (dans mon cas) dans ce pipe.
 
Ce que je souhaite faire
 
Le top serait de lancer un compteur au début du script qui clos et re effectue la connexion à la bdd toutes les X minutes.
Et pendant ce laps de temps je peux faire toutes les requetes que je veux.
Je pensais forker le script pour que le processus bloquant ne joue pas sur le compteur de temps mais comment faire en sorte que le processus bloquant recoit les paramètres de connexion a la bdd lorsque celle ci est cloturée, relancée.
 
en gros je cherche a faire communiquer 2 processus pour que l'un recupère la variable lui permettant d'envoyer ces commandes sql dans la bonne connexion BDD.
 
Vous avez une soluce ?
 
PS : p'tet que fork n'est pas la meilleure solution mais il me viens que ca en tête


Reply

Sujets relatifs:

Leave a Replay

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