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 08/12/2010, à 18:03

Sicabol

[Résolu] start-stop-daemon et tentatives de lancement

Bonjour,

Je voudrais lancer un script (que j'appellerais A) tous les jours et un autre (B) tous les quarts d'heure. Ces deux scripts utilisent les mêmes fichiers (ce sont des index de recherche - A fait une mise à jour globale, B fait une mise à jour "live"). Le script quotidien A nécessite en gros un traitement durant 30 minutes, le script B dure entre 5 et 20 minutes selon les cas…
Pour le script B, j'ai utilisé start-stop-daemon en indiquant un fichier PIDfile dans la commande start-stop-daemon : ça marche nickel. Mais comme les deux scripts utilisent les mêmes fichiers, j'ai préféré faire en sorte que B ne se lance pas quand A est potentiellement en train de tourner… J'ai donc paramétré CRON pour que A soit lancé à minuit et B tous les 1/4 d'heures entre 1h et 23h. Ce n'est donc pas génial, vu que B ne tourne pas pendant deux heures…

Je cherche donc un moyen de lancer B tous les 1/4 d'heures et que si B est en cours de traitement quand A veut se lancer (à minuit), A attende patiemment que B termine. A et B partageraient alors le même PIDfile. Par contre, je ne sais pas s'il est possible de faire patienter A. L'option --retry ne semble pas correspondre à mes besoins, à moins que j'aie mal compris.

Quelqu'un peut-il m'aider ? Merci d'avance !

Dernière modification par Sicabol (Le 09/12/2010, à 12:16)

Hors ligne

#2 Le 08/12/2010, à 19:10

hardball

Re : [Résolu] start-stop-daemon et tentatives de lancement

salut

1/ es-tu sûr d'avoir besoin d'un demon ?
une tâche cronifiée peut suffire

2/ si une tâche cronifiée suffit
peux tu fusionner tes 2 scripts (ou créer un 3e script)
il serait programmé toutes les 15 minutes
il disposerait d'un compteur
- il exécuterait ce que fait B
- quand le compteur serait égal à un nombre défini,  il exécuterait A à la place de B (et raz le compteur)

3/ si tu ne peux pas fusionner les 2 scripts (ou les lancer à partir d'un 3e)
tu peux gérer le fait que les 2 scripts ne se lancent pas en même temps grace à un fichier d'exclusion mutuelle.
(créé par le 1er script, sa présence bloque l'autre script, le 1er script supprime le fichier avant de se terminer)


-- Toshiba satelliteA100-335 + Ubuntu Jaunty --
Pour les noobs : Bienvenue ! ici la perséverance vous récompense.
Pour les anciens : Merci à vous de partager votre savoir.
Et vive le perl !

Hors ligne

#3 Le 09/12/2010, à 09:53

Sicabol

Re : [Résolu] start-stop-daemon et tentatives de lancement

Bonjour Hardball, et merci de ta réponse.

J'ai choisi de lancer un daemon afin de m'assurer que la tâche ne soit pas lancée plusieurs fois en parallèle. Il est déjà arrivé qu'une indexation prenne plus de temps que la normale, entraînant une seconde indexation prenant alors la totalité du CPU donc encore plus longue, rejointe par une troisième indexation et caetera… Le daemon me permet donc de vérifier que la tâche précédente n'est plus en route.

Hors ligne

#4 Le 09/12/2010, à 11:43

hardball

Re : [Résolu] start-stop-daemon et tentatives de lancement

hello

pour éviter simplement qu'un script se lance en double, tu peux t'aider de fichiers pid et/ou vérifier si le process tourne encore

#!/bin/bash

if [ -f fichier.pid ] ; then
    is_running=`pidof -x $0 | grep -f fichier.pid -m 1 -c`
    if [ "$is_running" == "1" ] ; then
        echo "INFO: le script $0 est deja en cours d'execution : EXIT"
        exit 0
    else
        echo "WARNING: on a un fichier pid mais $0 ne s'executait pas"
    fi
fi

echo "lancement du traitement (pid=$$)"
echo $$ > fichier.pid
trap "rm -f fichier.pid" SIGINT

hier=`date +%Y%m%d -d "1 day ago"`
flag_A_hier="A_a_ete_lance_le_$hier.ok"

aujourdhui=`date +%Y%m%d`
flag_A_aujourdhui="A_a_ete_lance_le_$aujourdhui.ok"


if [ -f $flag_A_aujourdhui ] ; then
    echo "A a deja ete lance aujourd'hui (le fichier $flag_A_aujourdhui existe)"
    # traitement B :
    echo "lancement de B"
    sleep 60
else
    # traitement A :
    echo "A n'a pas ete lance aujourd'hui (le fichier $flag_A_aujourdhui n'existe pas)"

    echo "suppression du fichier $flag_A_hier"
    rm -f $flag_A_hier
    echo "creation du fichier $flag_A_aujourdhui"
    touch $flag_A_aujourdhui

    echo "lancement de A"
    sleep 600
fi

echo "fin du traitement (pid=$$)"

rm -f fichier.pid
exit 0

### FIN

-- Toshiba satelliteA100-335 + Ubuntu Jaunty --
Pour les noobs : Bienvenue ! ici la perséverance vous récompense.
Pour les anciens : Merci à vous de partager votre savoir.
Et vive le perl !

Hors ligne

#5 Le 09/12/2010, à 11:57

Sicabol

Re : [Résolu] start-stop-daemon et tentatives de lancement

Merci Hardball !

Ce n'est pas exactement ce que je voudrais faire, mais cela me donne des pistes très intéressantes wink

Je veux que le script B soit lancé toutes les quinze minutes, sachant que si le script A ou le script B est déjà en cours de traitement il ne se lance pas (l'utilisation de start-stop-daemon avec création d'un pid marche bien).
Pour le script A, lancé tous les jours vers minuit, j'aimerais que si B est en cours de traitement, A attende patiemment que B se termine, puis se lance…

Je vais chercher dans les docs de shell, il doit bien y avoir une boucle "while" pour adapter ton code à ma façon big_smile

Merci encore !

Dernière modification par Sicabol (Le 09/12/2010, à 11:59)

Hors ligne

#6 Le 09/12/2010, à 12:16

Sicabol

Re : [Résolu] start-stop-daemon et tentatives de lancement

J'ai analysé ce que ton script faisait, et il convient exactement à mes besoins… tongue
Merci encore !

Hors ligne