Contenu | Rechercher | Menus

Annonce

Si vous avez des soucis pour rester connecté, déconnectez-vous puis reconnectez-vous depuis ce lien en cochant la case
Me connecter automatiquement lors de mes prochaines visites.

À propos de l'équipe du forum.

#1 Le 24/06/2009, à 18:08

stef28

expect et crontab

Bonjour,

J'ai fait un petit script en bash qui fait appel à des fonctions expect et qui me permet de faire une copie d'un fichier sur un serveur distant (je ne peux pas y  mettre de clefs SSH). Voici le script :

#! /bin/bash
# Définition des variables
DATA_USER="login"
DATA_PASSW="mdp"
day=$(date +\%Y\%m\%d)

# Le script proprement dit
echo "Sauvegarde "
     expect -c 'set timeout 30;\
     spawn scp /chemin/vers/mon_fichier.tar.gz login@serveur-distant:/home/user/cdi/mon_fichier'$day'.tar.gz;\
     expect "Password:" { send "'$DATA_PASSW'\n" };\
     exp_internal 1;\
     interact;' > /dev/null
echo "Sauvegarde terminée."

Bref, tant que je le lance à la main, ça fonctionne très bien mais dès que je veux l'intégrer dans un crontab de la manière suivante :

00 20 * * 1-5	root	/chemin/vers/monscript.sh

ça ne fonctionne pas sad

Je précise qu'il est bien exécutable et qu'il appartient à root et à son groupe.

Si une âme charitable voulait bien m'aider smile

Merci d'avance


stef

Hors ligne

#2 Le 24/06/2009, à 18:22

Qid

Re : expect et crontab

il me semblait que pour lancer un .sh la ligne de commande etait
"sh fichier.sh" ? je me trompe ? non parce que dans ce cas ton crontab est faux wink


"GNU/Linux c'est que du bon mais M$ Windows ce n'est pas si mal"
Référent technique Ubuntu d'un Groupe d'Utilisateur du Libre
plus d'info sur mon profil

Hors ligne

#3 Le 24/06/2009, à 18:32

stef28

Re : expect et crontab

Qid a écrit :

il me semblait que pour lancer un .sh la ligne de commande etait
"sh fichier.sh" ? je me trompe ? non parce que dans ce cas ton crontab est faux wink

On peut également le lancer dans le sh si le fichier est exécutable. En tout état de cause j'ai essayé les deux possibilités et aucune ne fonctionne sad


stef

Hors ligne

#4 Le 25/06/2009, à 00:09

BorX

Re : expect et crontab

Juste pour info, tu testes si ton script a été lancé chaque jour du lundi au vendredi à 20h00, ou bien tu modifies ta crontab pour faire des tests ? big_smile
(désolé pour la question idiote, c'était juste pour confirmer que c'était bien ce que tu avais programmé tongue).

Sinon, comment as-tu paramétré ta crontab ?
Dans un fichier de /etc, ou bien avec la commande crontab -e ?
Car dans le dernier cas, tu n'as pas à spécifier la colonne root (qui serait sinon interprétée comme une commande à part entière).
Donc :

00 20 * * 1-5    /chemin/vers/monscript.sh

Sinon, ajoute une commande au début de ton script pour savoir s'il ne serait pas lancé malgré tout ; par exemple :

touch /tmp/monscript_lance

Et tu peux aussi rediriger les sorties dans un fichier pour savoir s'il n'est pas démarré quand même :

00 20 * * 1-5    /chemin/vers/monscript.sh >/tmp/monscript.log 2>&1

Dernière modification par BorX (Le 25/06/2009, à 00:12)

Hors ligne

#5 Le 25/06/2009, à 06:51

stef28

Re : expect et crontab

BorX a écrit :

Juste pour info, tu testes si ton script a été lancé chaque jour du lundi au vendredi à 20h00, ou bien tu modifies ta crontab pour faire des tests ? big_smile
(désolé pour la question idiote, c'était juste pour confirmer que c'était bien ce que tu avais programmé tongue).

Ma sauvegarde doit avoir lieu tous les jours du lundi au vendredi !

BorX a écrit :

Sinon, comment as-tu paramétré ta crontab ?
Dans un fichier de /etc, ou bien avec la commande crontab -e ?
Car dans le dernier cas, tu n'as pas à spécifier la colonne root (qui serait sinon interprétée comme une commande à part entière).
Donc :

00 20 * * 1-5    /chemin/vers/monscript.sh

J'ai essayé les deux méthodes sans résultats sad

BorX a écrit :

Sinon, ajoute une commande au début de ton script pour savoir s'il ne serait pas lancé malgré tout ; par exemple :

touch /tmp/monscript_lance

Et tu peux aussi rediriger les sorties dans un fichier pour savoir s'il n'est pas démarré quand même :

00 20 * * 1-5    /chemin/vers/monscript.sh >/tmp/monscript.log 2>&1

Je vais tester ça ... je te tiens au courant


stef

Hors ligne

#6 Le 26/06/2009, à 09:58

stef28

Re : expect et crontab

Bon, tes conseils m'ont servis mais ça ne fonctionne pas encore :

- le script se lance bien car le "touch" crée bien le fichier
- la redirection vers un fichier de sortie m'a indiqué qu'il attendait le "finger print" donc j'ai transformé mon script de la manière suivante :

#! /bin/bash
# Définition des variables
DATA_USER="login"
DATA_PASSW="mdp"
day=$(date +\%Y\%m\%d)

# Le script proprement dit
echo "Sauvegarde "
     expect -c 'set timeout 30;\
     spawn scp -o StrictHostKeyChecking=no /chemin/vers/mon_fichier.tar.gz login@serveur-distant:/home/user/cdi/mon_fichier'$day'.tar.gz;\
     expect "Password:" { send "'$DATA_PASSW'\n" };\
     interact;' > /dev/null
echo "Sauvegarde terminée."

Pour le crontab, j'ai laissé l'écriture dans un fichier de sortie qui me dit à la fin : Sauvegarde terminée.

Mais la partie "expect" n'est toujours pas exécutée ..... sad

Je suis preneur de tout autre idée !


stef

Hors ligne

#7 Le 26/06/2009, à 10:18

BorX

Re : expect et crontab

Bon ! On sait donc que la crontab est bonne, puisque le script est bien appelé. Par ailleurs, la redirection te permet d'en savoir plus sur ce que ton script dit ou sur ce qu'il attend.

Le problème, maintenant, c'est vraiment la partie expect, et là, on touche à une commande que je ne connais vraiment pas du tout. La taille de la man page montre qu'il s'agit d'une commande très puissante, et un peu compliquée.
Je te recommande d'en parler dans la partie "Développement" du forum.

Cela dit, encore un conseil... Tu dis que ton script fonctionne quand tu le lances à la main, mais pas par crontab.
C'est un cas fréquent quand on utilise cron, car on oublie souvent que l'environnement courant n'est pas chargé. Bon nombre de scripts qui fonctionnent avec des variables définies dans l'environnement courant ne fonctionne pas avec cron, car on oublie de recharger l'environnement courant.

Il faudrait donc que tu vois si ton script ne requiert pas une variable d'environnement quelconque. Ajoute la commande set au début de ton script pour savoir dans quel environnement il est lancé quand tu le lances manuellement et quand il est lancé par cron afin que tu compares les deux.

Hors ligne