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

Shell et commandes GNU Discussion :

Script fonctionnant en manuel mais pas avec cron


Sujet :

Shell et commandes GNU

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Octobre 2010
    Messages
    18
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2010
    Messages : 18
    Par défaut Script fonctionnant en manuel mais pas avec cron
    Bonjour , avant de poster je tiens à dire que j'ai lu plusieurs topics parlant de sujet identiques :
    http://www.developpez.net/forums/d10...tab-ne-marche/
    http://www.developpez.net/forums/d69...cement-manuel/
    http://lea-linux.org/forums/read.php?1,44295

    Mais que je ne m'en sort toujours pas...

    j'ai mon script :
    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
     
    result=`/u01/app/oracle/product/o10g/bin/sqlplus -s ${2}/${3}@${1} <<!!!!END!!!!   
     
    set heading off
    set term off
    set echo off
    set feed 0
    set ver off
    set serveroutput on
    DECLARE
    	CURSOR c IS
    	SELECT xxx
    	FROM xxx
    	WHERE xx
     
    BEGIN
    	FOR rec IN c
    	LOOP
    		dbms_output.put_line(rec.xxx);
    	END LOOP;
    END;
    /
    !!!!END!!!!`
     
    countresult=`/u01/app/oracle/product/o10g/bin/sqlplus -s ${2}/${3}@${1} <<!!!!END!!!!   
     
    set heading off
    set term off
    set echo off
    set feed 0
    set ver off
    set serveroutput on
     
    SELECT count(xxx)
    FROM xxx
    WHERE xxx
    !!!!END!!!!`
     
    /bin/echo "result : "${result}
    /bin/echo "countresult : "${countresult}
    set -A array ${result}
    /bin/cat /EKPATCHS/Jelly/JELLY_COMP.xml
     
    for (( i=0; i<countresult; i++ ))
    do
    /bin/sed -i "/${array[$i]}/d" /EKPATCHS/Jelly/JELLY_COMP.xml
     
    traitement=`/u01/app/oracle/product/o10g/bin/sqlplus -s ${2}/${3}@${1} <<!!!!END!!!!
    UPDATE xxx set xxx
    WHERE xxx
    !!!!END!!!!`
     
    /bin/echo "traitement : "${traitement}
    done 
    /bin/cat /EKPATCHS/Jelly/JELLY_COMP.xml
    que j'apelle avec le crontab :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    */5 * * * * /EKPATCHS/Jelly/purge_JELLY_COMP.sh xxx xxx xxx >> /tmp/script.log

    et donc le script marche très bien manuellement mais pas avec crontab.

    j'ai lu qu'il fallait que les chemins soit absolus : je l'ai fait sauf pour la commande set que je ne sais pas comment gérer.

    j'ai lu que crontab était lancé depuis un environnement restreint , mais je ne sais pas trop quoi faire dans mon cas spécifique sachant ça.

    pour info , dans mon fichier de log, j'ai uniquement :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    result :
    countresult :
    sans même de valeur apparaissant.

    I need some help

  2. #2
    Rédacteur

    Avatar de ram-0000
    Homme Profil pro
    Consultant en sécurité
    Inscrit en
    Mai 2007
    Messages
    11 517
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Consultant en sécurité
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mai 2007
    Messages : 11 517
    Par défaut
    Est-ce que TOUTES les variables d'environnement nécessaires à ton script sont redéfinies dans ton script ou bien est ce qu'elles proviennent de ton environnement (.profile, .bashrc, ...) et donc seront manquante si ton script est invoqué depuis le cron.
    Raymond
    Vous souhaitez participer à la rubrique Réseaux ? Contactez-moi

    Cafuro Cafuro est un outil SNMP dont le but est d'aider les administrateurs système et réseau à configurer leurs équipements SNMP réseau.
    e-verbe Un logiciel de conjugaison des verbes de la langue française.

    Ma page personnelle sur DVP
    .

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Octobre 2010
    Messages
    18
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2010
    Messages : 18
    Par défaut
    Justement c'est bien ce que je ne sais pas définir.
    par rapport aux différentes commandes que j'invoque , de quelles variables d'environnement aurais-je normalement besoin de définir ?
    c'est ce que j'ignore , et je ne sais pas comment m'y prendre pour le savoir.

  4. #4
    Membre averti
    Profil pro
    Inscrit en
    Octobre 2010
    Messages
    18
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2010
    Messages : 18
    Par défaut
    @disedorgue

    je ne connaissait pas le shebang, je test donc de mettre

    au début de mon fichier ?

    test réalisé et rien ne change.

  5. #5
    Rédacteur

    Avatar de ram-0000
    Homme Profil pro
    Consultant en sécurité
    Inscrit en
    Mai 2007
    Messages
    11 517
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Consultant en sécurité
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mai 2007
    Messages : 11 517
    Par défaut
    Citation Envoyé par megayaya Voir le message
    c'est ce que j'ignore , et je ne sais pas comment m'y prendre pour le savoir.
    tu fais un set ou setenv ou prinenv (je ne sais pas la commande, c'est selon ton shell) dans ton shell (celui où le script fonctionne)

    tu ajoute dans ton script une commande "set (ou setenv ou printenv) > /tmp/env.txt" en tout début de script et tu fais en sorte que ton script soit appelé par le cron.

    puis tu compares les résultats entre la sortie de ton shell et le contenu du fichier /tmp/env.txt et pour chaque différence, tu te demandes :
    • c'est quoi ?
    • est-ce que c'est utile pour mon script ?
    et suivant la réponse tu définis la variable dans ton script

    Citation Envoyé par megayaya Voir le message
    Pas d'espace entre "#!" et "/bin/sh"

    et en fait, le mieux est de mettre le chemin de ton shell de connexion (/usr/bin/tcsh par exemple), pas forcément /bin/sh
    Raymond
    Vous souhaitez participer à la rubrique Réseaux ? Contactez-moi

    Cafuro Cafuro est un outil SNMP dont le but est d'aider les administrateurs système et réseau à configurer leurs équipements SNMP réseau.
    e-verbe Un logiciel de conjugaison des verbes de la langue française.

    Ma page personnelle sur DVP
    .

  6. #6
    Expert confirmé Avatar de disedorgue
    Homme Profil pro
    Ingénieur intégration
    Inscrit en
    Décembre 2012
    Messages
    4 349
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur intégration
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Décembre 2012
    Messages : 4 349
    Par défaut
    Bonjour,

    Le shebang sur la première ligne de ton script ?

    Cordialement.

  7. #7
    Expert confirmé
    Homme Profil pro
    Développeur informatique en retraite
    Inscrit en
    Avril 2008
    Messages
    2 102
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Côtes d'Armor (Bretagne)

    Informations professionnelles :
    Activité : Développeur informatique en retraite

    Informations forums :
    Inscription : Avril 2008
    Messages : 2 102
    Par défaut
    à tout hasard, essaie de récupérer aussi la stderr dans tes variables et imprime plus tôt le contenu de 'result'
    et pourquoi prendre le risque d'utiliser un caractère aussi spécial que le bang?
    et, pendant qu'on y est, je supprimerais les espaces à la fin de la ligne contenant '<<':
    Code shell : 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
    #!/bin/sh
    result=`/u01/app/oracle/product/o10g/bin/sqlplus -s ${2}/${3}@${1} 2>&1 <<EOF
    
    set heading off
    set term off
    set echo off
    set feed 0
    set ver off
    set serveroutput on
    DECLARE
    	CURSOR c IS
    	SELECT xxx
    	FROM xxx
    	WHERE xx
    	
    BEGIN
    	FOR rec IN c
    	LOOP
    		dbms_output.put_line(rec.xxx);
    	END LOOP;
    END;
    /
    EOF`
    /bin/echo "result : "${result}
    
    countresult=`/u01/app/oracle/product/o10g/bin/sqlplus -s ${2}/${3}@${1} 2>&1 <<EOF
    
    set heading off
    set term off
    set echo off
    set feed 0
    set ver off
    set serveroutput on
    
    SELECT count(xxx)
    FROM xxx
    WHERE xxx
    EOF`
    
    /bin/echo "countresult : "${countresult}
    set -A array ${result}
    /bin/cat /EKPATCHS/Jelly/JELLY_COMP.xml
    
    for (( i=0; i<countresult; i++ ))
    do
    /bin/sed -i "/${array[$i]}/d" /EKPATCHS/Jelly/JELLY_COMP.xml
    
    traitement=`/u01/app/oracle/product/o10g/bin/sqlplus -s ${2}/${3}@${1} 2>&1 <<EOF
    UPDATE xxx set xxx
    WHERE xxx
    EOF`
    
    /bin/echo "traitement : "${traitement}
    done 
    /bin/cat /EKPATCHS/Jelly/JELLY_COMP.xml

  8. #8
    Expert confirmé Avatar de disedorgue
    Homme Profil pro
    Ingénieur intégration
    Inscrit en
    Décembre 2012
    Messages
    4 349
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur intégration
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Décembre 2012
    Messages : 4 349
    Par défaut
    Et au pire du pire, si cela ne focntionne toujours pas, mettre en debug, cela peut donner des pistes:
    pour le shell
    Après le souci peut-etre sur la commande sqlplus.
    Donc, tu peux aussi rajouter dans ta première ligne de sqlplus:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    spool /tmp/scriptsqlN.log
    avec N pour valeur 1, pour le 1er script, 2, pour le 2éme,etc..

    Cordialement.

  9. #9
    Membre prolifique
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 835
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 835
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par megayaya Voir le message
    j'ai lu qu'il fallait que les chemins soit absolus : je l'ai fait
    Bonjour
    Ce n'est pas obligatoire. Le cron travaille à partir du HOME de celui qui le lance. De plus, il est aussi possible de lui rajouter un environnement de travail. Suffit de mettre les lignes "variable=valeur" classiques dans le crontab au dessus des lignes définissant sa périodicité...

    Maintenant on remarque que ton script se lance. Son seul soucis est qu'il ne renvoie rien. Donc peut-être tu pourrais rajouter quelques echo bien placés pour vérifier certaines valeurs...
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

  10. #10
    Membre averti
    Profil pro
    Inscrit en
    Octobre 2010
    Messages
    18
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2010
    Messages : 18
    Par défaut WIN
    merci a tous , grâce a vos conseil j'ai réussi à faire marcher le tout :
    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
     
     
    #!/bin/ksh
     
    base=${1}
    user=${2}
    pwddb=${3}
     
    export ORACLE_BASE=/u01/app/oracle/product/o10g
    export ORACLE_HOME=/u01/app/oracle/product/o10g
    export ORACLE_SID=***
    export PATH=******
    export conn=${user}/${pwddb}@${base} 
     
    result=`sqlplus -s $conn <<!!!!END!!!!
    set heading off
    set term off
    set echo off
    set feed 0
    set ver off
    set serveroutput on
    DECLARE
    	CURSOR c IS
    	SELECT ***
    	FROM ***
    	WHERE ***
    	BEGIN
    	FOR rec IN c LOOP
    		dbms_output.put_line(rec.***);
    	END LOOP;
    END;
    /
    !!!!END!!!!`
     
    echo "SELECT 1 : ${result}"
     
    countresult=`sqlplus -s $conn <<!!!!END!!!!
    set heading off
    SELECT count(***)
    FROM ***
    WHERE **
    !!!!END!!!!`
     
    echo "SELECT 2 : ${countresult}"
     
    set -A array ${result}
     
    cat /EKPATCHS/Jelly/JELLY_COMP.xml
     
    for (( i=0; i<${countresult}; i++ ))
    do
    sed -i "/${array[$i]}/d" /EKPATCHS/Jelly/JELLY_COMP.xml
    traitement=`sqlplus -s $conn <<!!!!END!!!!
    UPDATE ***
    SET **=**
    WHERE ***= '${array[$i]}'
    !!!!END!!!!`
     
    echo "fin traitement"
    done 
     
    cat /EKPATCHS/Jelly/JELLY_COMP.xml

    Donc le problème vennait bien des variables d'environnement a positionner, et grâce a vous je sais lesquelles positionner et ou dans le code.

    Merci a tous pour votre aide !

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Encore un fichier SH qui fonctionne en manuel mais pas en crontab
    Par nicolas2603 dans le forum Shell et commandes GNU
    Réponses: 4
    Dernier message: 06/06/2013, 14h59
  2. Script fonctionne sur firefox mais pas IE
    Par johndu81 dans le forum Général JavaScript
    Réponses: 4
    Dernier message: 17/01/2013, 01h29
  3. Réponses: 1
    Dernier message: 02/05/2010, 17h12
  4. Script fonctionnant sur Mozilla mais pas sur IE !!!
    Par guigui48 dans le forum Mise en page CSS
    Réponses: 3
    Dernier message: 19/02/2010, 11h43
  5. Programme fonctionnant sur Eclipse mais pas avec le jar?
    Par kirik dans le forum Eclipse Java
    Réponses: 2
    Dernier message: 10/02/2004, 13h43

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