At : script ne se lance pas

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. Contributeur
    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
    1. Contributeur
      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
      1. Contributeur
        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
        1. Contributeur
          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
          1. Contributeur
            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