Précédent   Forum des professionnels en informatique > Systèmes > Linux > Système
Système Vos questions autour de l'administration système
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
Vieux 20/01/2010, 16h44   #1
Membre habitué
 
Inscription : novembre 2005
Messages : 222
Détails du profil
Informations forums :
Inscription : novembre 2005
Messages : 222
Points : 100
Points : 100
Par défaut [CRON] Timeout lors de l'execution?

Bonjour

Quand on lance un script via cron, existe-t-il un timeout particulier qui arrête l'exécution du script? Je m'explique.

j'ai un script sh qui lance successivement 2 programmes Java. Le premier peut mettre + de 4h de traitements. (je sais c'est beaucoup mais je peux pas faire autrement). le script se présente comme ça

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
 
cd /home/monrepertoire
echo "[SH] Re initialisation de la console">>console
rm -Rf console
#lancement1
echo "[SH] lancement1">>console
java -Xmx1024M -jar execution1.jar>>console
#celui qui dure plus de 4h
 
#lancement2
echo "[SH] Lancement2">>console
java -jar -Xmx1024M -jar lancement2.jar>>console
#celui la dure quelques secondes
echo "[SH]END OF SCRIPT reportgenerator.sh">>console
Quand je le lance manuellement, dans les même conditions que cron (même utilisateur par exemple) tout se passe bien.

Cron lance le script à la bonne heure, execute bien le premier programme mais ne lance jamais le second (je ne vois même pas la "[SH] lancement2" dans le fichier console, ni celui d'après).

Alors je me dis que :
-soit au bout d'un certains temps cron arrête lui même le script (mais pas l'execution java) pensant que le script ne reponds plus
-soit il n'exécute pas les taches séquentiellement (un peu comme si j'avais mis un & à la fin de la commande) que mon programme2 soit exécuté bien avant la fin du programme. Mais dans ce cas pourquoi je ne vois pas les traces? et pourquoi il ne me fait pas la même chose quand je le lance moi même dans le shell?

Bref je penche plus pour la première hypothèse et si c'est ça comment résoudre ce problème?

Merci d'avance
nezdeboeuf62 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 20/01/2010, 17h25   #2
Expert Confirmé Sénior
 
Homme Laurent Willems
Expert Stop/Start
Inscription : septembre 2002
Messages : 2 472
Détails du profil
Informations personnelles :
Nom : Homme Laurent Willems
Âge : 33
Localisation : Belgique

Informations professionnelles :
Activité : Expert Stop/Start

Informations forums :
Inscription : septembre 2002
Messages : 2 472
Points : 4 097
Points : 4 097
Salut,

Peux-tu fusionner l'erreur standard avec l'output standard afin de voir les éventuelles erreurs?

Code :
1
2
java -jar -Xmx1024M -jar lancement2.jar>>console 2>&1
__________________
Alea Jacta Test!
Mygale1978 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 20/01/2010, 18h00   #3
Membre habitué
 
Inscription : novembre 2005
Messages : 222
Détails du profil
Informations forums :
Inscription : novembre 2005
Messages : 222
Points : 100
Points : 100
Citation:
Envoyé par Mygale1978 Voir le message
Salut,

Peux-tu fusionner l'erreur standard avec l'output standard afin de voir les éventuelles erreurs?

Code :
1
2
java -jar -Xmx1024M -jar lancement2.jar>>console 2>&1
Merci pour la réponse. je vais changer le script mais compte tenu du temps d'execution je n'aurais de réponse que demain. Pour aller un peu plus vite cette sortie d'erreur je ne peux pas la lire ailleurs? par défaut cela se situe où ça?

je suis sur un serveur ubuntu hardy. merci

EDIT: je me pose un petite question comme ça. Si il y avait une erreur au lancement de lancement2.jar, je devrais voir le message "[SH] lancement2" non?

Dernière modification par nezdeboeuf62 ; 20/01/2010 à 18h10.
nezdeboeuf62 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 21/01/2010, 14h08   #4
Membre habitué
 
Inscription : novembre 2005
Messages : 222
Détails du profil
Informations forums :
Inscription : novembre 2005
Messages : 222
Points : 100
Points : 100
Petit bilan de l'execution d'hier soir.

comme log de script ne ne vois que
et rien d'autre ni erreur ni rien du tout! simplement la fin du premier programme java.

Je reste donc sur mon hypothèse :
-cron lance mon script en donnant un PID.
-le programme java se lance avec un autre PID.
-Voyant qu'au bout d'un certains temps le script ne bouge pas (vu que le programme java dure 4h!!!), cron croit que le script ne réponds plus et donc arrête l'execution. Une fois le programme java terminé, on ne peut plus lancer la suite du script.

Donc existe-t-il un moyen de paramétrer ceci? ou puis je voir les logs de cron afin de voir si mon script s'arrête bien de manière forcée????

merci d'avance
nezdeboeuf62 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 23/01/2010, 13h30   #5
Membre confirmé
 
Avatar de exodev
 
Inscription : septembre 2009
Messages : 201
Détails du profil
Informations personnelles :
Âge : 25

Informations forums :
Inscription : septembre 2009
Messages : 201
Points : 292
Points : 292
Hello,

Une autre solution pourrait-être lié au premier lancement qui renverrait un signal de terminaison.

Rajouter la redirection du flux d'erreurs ( 2>&1 ) pour le premier lancement permettrait peut-être de déceler une erreur de ce côté
exodev est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 23/01/2010, 16h37   #6
Membre habitué
 
Inscription : novembre 2005
Messages : 222
Détails du profil
Informations forums :
Inscription : novembre 2005
Messages : 222
Points : 100
Points : 100
Citation:
Envoyé par exodev Voir le message
Hello,

Une autre solution pourrait-être lié au premier lancement qui renverrait un signal de terminaison.

Rajouter la redirection du flux d'erreurs ( 2>&1 ) pour le premier lancement permettrait peut-être de déceler une erreur de ce côté
Oups c'est une erreur de ma part de na pas l'avoir mis

Mais ce que je comprends pas c'est pourquoi, ça marche bien lorsque je lance le même script à la main???
nezdeboeuf62 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 23/01/2010, 16h57   #7
Expert Confirmé Sénior
 
Homme Laurent Willems
Expert Stop/Start
Inscription : septembre 2002
Messages : 2 472
Détails du profil
Informations personnelles :
Nom : Homme Laurent Willems
Âge : 33
Localisation : Belgique

Informations professionnelles :
Activité : Expert Stop/Start

Informations forums :
Inscription : septembre 2002
Messages : 2 472
Points : 4 097
Points : 4 097
Salut,

Lorsque tu lances un programme manuellement, tu es dans un shell avec certaines variables d'environnement définies. Par contre, lorsque tu executes ton programmes via crontab, ces variables ne sont pas définies sauf si tu as pris le soin de le faire dans ton script ou dans la crontab.

Ceci pourrait expliquer la différence de comportement entre l'execution manuelle et l'execution via la crontab.

Maintenant la seule manière de savoir est d'essayer logguer les erreurs notamment via la méthode qui t'a été demandée précédemment.

De plus, il serait également intérressant de savoir ce que font tes programmes java (appels a des commandes systèmes?)
__________________
Alea Jacta Test!
Mygale1978 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 23/01/2010, 17h49   #8
Membre habitué
 
Inscription : novembre 2005
Messages : 222
Détails du profil
Informations forums :
Inscription : novembre 2005
Messages : 222
Points : 100
Points : 100
Citation:
Envoyé par Mygale1978 Voir le message
Salut,

Lorsque tu lances un programme manuellement, tu es dans un shell avec certaines variables d'environnement définies. Par contre, lorsque tu executes ton programmes via crontab, ces variables ne sont pas définies sauf si tu as pris le soin de le faire dans ton script ou dans la crontab.

Ceci pourrait expliquer la différence de comportement entre l'execution manuelle et l'execution via la crontab.

Maintenant la seule manière de savoir est d'essayer logguer les erreurs notamment via la méthode qui t'a été demandée précédemment.

De plus, il serait également intérressant de savoir ce que font tes programmes java (appels a des commandes systèmes?)
j'ai changé mon script dès que j'aurais plus de nouvelles je vous les présentrais.

Mes programmes Java ne font rien de système. C'est assez spécifique donc dur à expliquer mais grosso modo ils vont rechercher des données dans plusieurs bases et les ecrits dans des fichiers. Ca c'est pour le premier programme.

Le second reprends ces fichiers puis les recopies dans d'autres dossiers.

C'est la grande masse de données à manipuler qui créer de tels temps d'execution

En tout cas merci pour les réponses
nezdeboeuf62 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 05/02/2010, 17h14   #9
Membre habitué
 
Inscription : novembre 2005
Messages : 222
Détails du profil
Informations forums :
Inscription : novembre 2005
Messages : 222
Points : 100
Points : 100
Bonjour,

Ca fait un petit moment que je galère avec ça et donc du coup j'ai changé mon fusil d'epaule. Pour commencer j'ai fais refaire le programme java pour qu'il fasse tout en même temps que l'on lance avec une seule commande. Ce programme génère des fichiers sur le disque, après ces fichiers doivent être copiés dans un autre endroit disponible à l'utilisateur. On ne copie pas directement dans la bonne directory, pour eviter des erreurs (si le programme crash en plein milieu ou ce genre de truc).

Or le phénomène est le même.

Pour contourner ça, j'ai fait 2 scripts. Le premier contenant l'appel java. Le second s'occupant du transfert de fichier.

Code :
1
2
3
4
5
6
7
8
9
10
 
#On se place dans le repertoire reportgenerator
echo "[SH] On se place dans le repertoire"
cd /home/directory/
echo "[SH] copie des fichiers">>console 2>&1
cp -Rf files/* files2/
#vide le repertoire tmp
echo "[SH] Vide le repertoire files">>console 2>&1
rm -Rf files/*
echo "[SH]END OF SCRIPT">>console 2>&1
Connaissant le temps moyen du programme java je peux programmer le lancement de la seconde tache à une heure dont je suis sur que le programme java est lancé. Cette solution n'est pas encore satisfaisante, mais elle marche à 95%

Le soucis c'est que j'ai exactement la même chose dans le second script! C'est à dire que si je le lance dans un shell à la main tout se passe super bien par contre si je le lance via cron, seule la première copie se fait, je ne vois même pas les messages 'echo' ni aucune remonté d'erreurs !!!

Vraiment je suis perdu, j'en suis à me demander s'il n'y a pas un nombre de lignes limites pour les scripts ou ce genre de truc (totalement stupide)...

Bien entendu, j'ai pensé à des problèmes genre des droits sur les fichiers mais j'ai tout mis en 777, bien entendu c'est lancé à partir de la crontab du même utilisateurs que mon shell etc... et ça n'expliquerais pas l'absence de message...

Merci pour votre aide
nezdeboeuf62 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 05/02/2010, 18h10   #10
Expert Confirmé
 
Avatar de N_BaH
 
Inscription : février 2008
Messages : 1 896
Détails du profil
Informations forums :
Inscription : février 2008
Messages : 1 896
Points : 3 676
Points : 3 676
Bonjour,

Ceci te permettra, j'espère, d'avoir un rapport d'activité de ton script plus efficace
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#!/bin/bash
 
homeDir="/home/directory"
fileDir="$homeDir/files"
log="$homeDir/fichier.log"
 
# lancement du programme java
ta_commande_java
echo "java fini" >> $log
 
# on ne se déplace pas dans les répertoires !
# copie des fichiers
cp -R $fileDir ${fileDir}2 && echo "[SH] fichiers copiés" >> $log || echo "[SH] échec de la copie des fichiers" >> $log
#vidage le repertoire tmp
rm -R $fileDir && echo "[SH] répertoire files vidés" >> $log || echo "[SH] échec du vidage de files" >> $log
 
echo "[SH]END OF SCRIPT" >> $log
...
?
N_BaH est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 08/02/2010, 17h26   #11
Membre habitué
 
Inscription : novembre 2005
Messages : 222
Détails du profil
Informations forums :
Inscription : novembre 2005
Messages : 222
Points : 100
Points : 100
Citation:
Envoyé par N_BaH Voir le message
Bonjour,

Ceci te permettra, j'espère, d'avoir un rapport d'activité de ton script plus efficace
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#!/bin/bash
 
homeDir="/home/directory"
fileDir="$homeDir/files"
log="$homeDir/fichier.log"
 
# lancement du programme java
ta_commande_java
echo "java fini" >> $log
 
# on ne se déplace pas dans les répertoires !
# copie des fichiers
cp -R $fileDir ${fileDir}2 && echo "[SH] fichiers copiés" >> $log || echo "[SH] échec de la copie des fichiers" >> $log
#vidage le repertoire tmp
rm -R $fileDir && echo "[SH] répertoire files vidés" >> $log || echo "[SH] échec du vidage de files" >> $log
 
echo "[SH]END OF SCRIPT" >> $log
...
?
Bonjour,

non seulement le rapport est meilleur mais en plus ça à l'air de marcher !
je suis encore en cours de test mais ça se présente vraiment très bien, simplement des erreurs de ma part pour l'adressage (genre il supprime le dossier et pas simple son contenu etc...) mais j'ai pu le faire tourner plusieurs fois sans problèmes. Je suis en train de faire un dernier pour être sur mais ça sent vraiment bon...

Et je te remercie pour le script ça m'a appris quelques trucs (notamment l'utilisation des || et &&, très instructif).

Par contre je ne comprends toujours pas pourquoi ça ne marcher pas avant (même si c'était très mal codé), peut être le fait d'utiliser bash à la place de sh. A part ça je vois pas. Mais l'essentiel est que ça marche!!!

Merci beaucoup !!!!!
nezdeboeuf62 est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +1. Il est actuellement 12h50.


 
 
 
 
Partenaires

Hébergement Web