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

  • Votes
  • Date
  • Date décroissante
  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 ;)
    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
      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.
        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 ?
          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..