At : script ne se lance pas

Fermé
eZula Messages postés 3391 Date d'inscription samedi 26 avril 2008 Statut Contributeur Dernière intervention 8 mai 2021 - 28 sept. 2008 à 20:37
eZula Messages postés 3391 Date d'inscription samedi 26 avril 2008 Statut Contributeur Dernière intervention 8 mai 2021 - 29 sept. 2008 à 16:45
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 ?

5 réponses

Non2 Messages postés 5103 Date d'inscription mercredi 19 décembre 2007 Statut Contributeur Dernière intervention 15 juillet 2015 757
29 sept. 2008 à 01:12
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
eZula Messages postés 3391 Date d'inscription samedi 26 avril 2008 Statut Contributeur Dernière intervention 8 mai 2021 392
29 sept. 2008 à 09:43
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
Non2 Messages postés 5103 Date d'inscription mercredi 19 décembre 2007 Statut Contributeur Dernière intervention 15 juillet 2015 757
29 sept. 2008 à 10:05
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
eZula Messages postés 3391 Date d'inscription samedi 26 avril 2008 Statut Contributeur Dernière intervention 8 mai 2021 392
29 sept. 2008 à 10:41
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

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
eZula Messages postés 3391 Date d'inscription samedi 26 avril 2008 Statut Contributeur Dernière intervention 8 mai 2021 392
29 sept. 2008 à 16:45
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