#1 Le 08/12/2010, à 17: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, à 11:16)
Hors ligne
#2 Le 08/12/2010, à 18: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, à 08: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, à 10: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, à 10: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
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
Merci encore !
Dernière modification par Sicabol (Le 09/12/2010, à 10:59)
Hors ligne
#6 Le 09/12/2010, à 11: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…
Merci encore !
Hors ligne