At : script ne se lance pas

eZula Messages postés 3509 Statut Contributeur -  
eZula Messages postés 3509 Statut Contributeur -
Salut,

j'ai un pb avec un script "W.sh" censé se lancer au bout de 20' par la commande suivante :

at -f ~/Chemin du Script/W.sh now + 20 minutes


au bout de 20 minutes, le script ne se lance manifestement pas, je le sais parceque j'ai inclus dedans un truc tout bête dans le genre :

echo coucou4 >> fichier


et que ça n'apparait pas dans "fichier" au bout de ces 20'

ce qui est bizarre, c'est qu'en lançant manuellement ce script W.sh, il fait très bien ce qu'on lui demande, d'ailleurs il contient des instructions très simple (2 variables, un cd, un WGET, rien d'impressionant)

Ce qui est encore plus bizarre, c'est que dans le output de at, il y a un message d'erreur (qui apparait au bout de 20 minutes, donc), qui me dit qu'il n'a pas pu entrer dans un répertoire avec cd alors qu'à aucun moment il n'est question d'aller dans ce répertoire dans ce script.

Je reste vague mais de manière générale y aurait-il des précautions particulières à prendre avec at ? qu'est-ce qui vous vient à l'esprit en lisant ces mots ?
Configuration: Linux Suse
Firefox 3.0.2

5 réponses

  1. Non2 Messages postés 5103 Date d'inscription   Statut Contributeur Dernière intervention   759
     
    Bonjour,

    Après une petite recherche, il serait peut-être utile de vérifier si l'utilisateur est autorisé à l'utiliser.
    extrait du man at :

    Le superutilisateur peut toujours employer ces commandes. Pour les autres utilisateurs, les permissions sont déterminées par les fichiers /etc/at.allow et /etc/at.deny.

    Si le fichier /etc/at.allow existe, seuls les utilisateurs dont les noms sont mentionnés dans ce fichier peuvent utiliser at.

    Si /etc/at.allow n'existe pas, at vérifie si /etc/at.deny existe, et tous les utilisateurs non mentionnés dans ce fichier ont alors le droit d'invoquer at.

    Si aucun de ces deux fichiers n'existe, seul le superutilisateur a le droit d'appeler at.

    Un fichier /etc/at.deny vide signifie que tous les utilisateurs ont le droit d'appeler ces commandes ; c'est la configuration par défaut.


    Si ce n'est pas ça, il faudra attendre la réponse de quelqu'un d'autre, j'y connais trop peu pour aller plus loin..
    0
  2. eZula Messages postés 3509 Statut Contributeur 392
     
    Salut et merci,

    je n'avais pas pensé du tout à ça, voici donc le contenu du fichier at.deny (il n'y a pas de fichier at.allow)

    /etc # cat at.deny
    alias
    backup
    bin
    daemon
    ftp
    games
    gnats
    guest
    irc
    lp
    mail
    man
    nobody
    operator
    proxy
    qmaild
    qmaill
    qmailp
    qmailq
    qmailr
    qmails
    sync
    sys
    www-data


    c'est bizarre, je m'attendais à voir des noms d'utilisateurs... Aparemment il faudrait que je mette mon nom d'utilisateur dans un fichier at.allow ?

    Voici d'autre part ce qui me gêne dans le déroulement de ce script.

    Grossomodo, un premier script 1.sh de 72 lignes effectue une série de tests sur des fichiers, il crée ensuite un répertoire nommé mkdir ~/Chemin/0REP, puis passe à une boucle (while read line). Dans cette boucle il y a une condition qui si elle est satisfaite lance un deuxième script 2.sh. C'est dans ce script que at intervient et planifie une action "now + 20 minutes, qui va lancer W.sh comme dit plus haut, et indépendante du script initial 1.sh). Tant que les conditions sont satisfaites, la boucle se répète et autant de jobs peuvent être créés par At. Quand il n'y a plus les conditions, on sort de la boucle, et le répertoire ~/Chemin/0REP est supprimé.

    Mais quand je regarde le output de At, le message d'erreur est le suivant :

    sh: line 90: cd: Chemin/0REP: Aucun fichier ou dossier de ce type
    Execution directory inaccessible

    -> D'une part, aucun des scripts intervenant dans ce mécanisme ne dépasse les 72 lignes (c'est le plus gros, 1.sh)
    -> d'autre part, le seul moment dans lequel il est question d'aller dans ce répertoire Chemin/0REP, c'est au début du script 1.sh, ce qui ne devrait plus rien avoir avec ce qu'est censé faire le script lancé par At.

    On dirait qu'il revient au script 1.sh

    Une idée ?
    0
  3. Non2 Messages postés 5103 Date d'inscription   Statut Contributeur Dernière intervention   759
     
    Bonjour,

    Si j'en crois le man, oui, le nom d'utiisateur doit être ajouté.

    sh: line 90: cd: Chemin/0REP: Aucun fichier ou dossier de ce type : il semble pourtant qu'il fasse appel à la commande cd. Le script 01 ne recommence-t'il pas au départ en sortant de script 02 ? Il faudrait suivre le déroulement pas à pas pour savoir pourquoi il tente d'accéder au répertoire après sa suppression.
    Quant au numéro de ligne, on peut supposer que l'interpréteur considère l'ensemble des scripts comme un seul ensemble. A moins qu'il ne fasse en interne une "traduction" vers un langage de base (appel de fonction ou d'interruption en langage d'assemblage, par exemple).

    Pour ça et le reste, je ne sais pas, il faudra l'aide de quelqu'un plus compétant que moi en programmation. Peut-être poster un topic spécifique aux scripts dans le forum programmation.
    0
  4. eZula Messages postés 3509 Statut Contributeur 392
     
    Le script 01 ne recommence-t'il pas au départ en sortant de script 02


    c'est la seule explication possible puisque l'entrée dans ce répertoire n'apparait que deux fois dans l'ensemble des scripts (uniquement dans 1.sh, au début de la boucle), mais absolument pas dans W.sh ni dans aucun autre script

    Il y a des éléments un peu confidentiels dans ces scripts alors voici le shéma (j'ai épuré un peu) :

    1.sh
    
    mkdir ~/Chemin/0REP
    
    if grep "http" 0rep.txt
    then (
    while read line
    do (
    NoPost=$(echo $line | grep -o '\-[0-9]*\/' | sed 's/\-//g;s/\///g')
    cd ~/Chemin/0REP
    wget -ct inf -O $NoPost.html "$line"
    sed -n '/^.*erfervierh"/,/^.*<\/td\>.*$/p' ~/Chemin/0REP/$NoPost.html | sed 's/ons'enfout/g' > $NoPost.txt
    if egrep -io "(blabla|blibli|bloublou)" $NoPost.txt
    then (
    echo $line >> ~/Chemin/Journal.txt
    egrep -io "(blabla|blibli|bloublou)" $NoPost.txt >> ~/Chemin/Journal.txt
    mkdir ~/Chemin/Reponse/$NoPost
    mv ~/Chemin/0REP/$NoPost.* ~/Chemin/Reponse/$NoPost
    echo `md5sum ~/Chemin/Reponse/$NoPost/$NoPost.txt | cut -d" " -f1` > ~/Chemin/Reponse/$NoPost/md5.txt
    recode ISO-8859-1..UTF-8 ~/Chemin/Reponse/$NoPost/$NoPost.html
    echo $(grep -o -m1 "blabla" ~/Chemin/Reponse/$NoPost/$NoPost.html | sed 's/blibli//g') > ~/Chemin/Reponse/$NoPost/h.txt
    echo "$line" > ~/Chemin/Reponse/$NoPost/URL.txt
    echo $NoPost > ~/Chemin/Reponse/$NoPost/REP.txt
    cat ~/Chemin/Reponse/Job_Reponse.txt > ~/Chemin/Reponse/$NoPost/$NoPost.sh
    chmod +x ~/Chemin/Reponse/$NoPost/$NoPost.sh
    export NoPost
    export Message
    export line
    export ComptNoRep
    ~/Chemin/Reponse/$NoPost/$NoPost.sh
    export NoPost
    cd ~/Chemin
    ./BMH.sh
    ComptNoRep=$(( $ComptNoRep + 1 ))
    )
    fi
    ) done < 0rep.txt
    )
    else echo "blablabla" >> ~/Chemin/Journal.txt
    fi
    
    if [ -e ~/Chemin/0REP ]
    	then rm -rf ~/Chemin/0REP
    	fi


    ensuite, voici donc NoPost.sh (au-dessus je disais que c'était 2.sh, c'est donc lui qui lance At

    echo $line > ~/Chemin/Reponse/URL$ComptNoRep.txt
    echo $NoPost > ~/Chemin/Reponse/REP$ComptNoRep.txt
    
    at -f ~/Chemin/Reponse/Wget_URL.sh now + 20 minutes


    et enfin, Wget_URL.sh

    #!/bin/bash
    
    cd ~/Chemin/Reponse
    
    URL=$(cat ~/Chemin/Reponse/URL0.txt)
    REP=$(cat ~/Chemin/Reponse/REP0.txt)
    
    cd ~/Chemin/Reponse/$REP
    wget -ct inf $URL
    
    cd ~/Chemin/Reponse
    
    rm REP0.txt
    rm URL0.txt
    
    if [ -e REP*.txt ]
    	then (
    		for i in REP*; do numberREP=$(grep -o ':digit:' <<<$i); mv ${i} ${i/$numberREP/$(($numberREP -1))}; done
    		for i in URL*; do numberURL=$(grep -o ':digit:' <<<$i); mv ${i} ${i/$numberURL/$(($numberURL -1))}; done
    		)
    	fi


    c'est ce dernier qui n'est pas lancé par At et pour lequel on obtient l'erreur

    sh: line 90: cd: Chemin/0REP: Aucun fichier ou dossier de ce type
    Execution directory inaccessible 


    On dirait donc qu'il revient ici dans 1.sh

    	while read line
    		do (
    		NoPost=$(echo $line | grep -o '\-[0-9]*\/' | sed 's/\-//g;s/\///g')
    		cd ~/Chemin/0REP
    0
  5. Vous n’avez pas trouvé la réponse que vous recherchez ?

    Posez votre question
  6. eZula Messages postés 3509 Statut Contributeur 392
     
    Solution temporaire trouvée : exclure le job de la boucle while read line, et également supprimer la création du script qui lance ce job

    Vraiment je ne comprends pas pourquoi il retourne dans la boucle du script d'origine, si qqu'un a une idée... histoire de pas mourir idiot surtout ;)
    0