#1 Le 22/12/2015, à 20:44
- JujuLand
[Résolu] Script non exécuté dans le cron
Bonjour,
j'ai un script qui s'exécute parfaitement depuis le .profile (donc à la connexion)
Je veux l'exécuter depuis le cron (crontab -e)
25 19 * * * sendipp
Le script est situé dans /usr/local/bin
J'avais fait un essai sur mon ordi, et çà ne fonctionnait pas.
j'ai modifié la commande dans le cron en $(which sendipp) et là çà fonctionné.
25 19 * * * $(which sendipp)
Je positionne de la même façon sur un ordi connecté en ssh, et là çà ne fonctionne pas.
Pourtant, dans var/log/syslog, j'ai çà :
Dec 22 19:25:01 XPS-8900 CRON[23462]: (gavroche) CMD ($(which sendipp))
Celà pourrait-il venir du fait que j'ai exécuté le cron depuis une connexion ssh ?
Merci
A+
Dernière modification par JujuLand (Le 23/12/2015, à 12:10)
Xubuntu 16.04 > Dell DM061 (2007) + Dell Inspiron 531 (2008)
Xubuntu 16.04 > Asus X51L (2009) + MSI GX723 (2009)
Xubuntu 22.04 > HP 15BA048NF (2018)
Hors ligne
#2 Le 22/12/2015, à 23:25
- Arbiel
Re : [Résolu] Script non exécuté dans le cron
Bonsoir
J'ai vu il a peu une discussion sur le même sujet, Cherche sur le forum.
Je crois me souvenir que le problème survenait par le fait que les scripts exécutés sous contrôle de cron sont exécutés par l'utilisateur root.
Arbiel
Arbiel Perlacremaz
LDLC Aurore NK3S-8-S4 Ubuntu 20.04, GNOME 3.36.8
24.04 en cours de tests
Abandon d'azerty au profit de bépo, de google au profit de Lilo et de la messagerie électronique violable au profit de Protonmail, une messagerie chiffrée de poste de travail à poste de travail.
Hors ligne
#3 Le 23/12/2015, à 08:46
- carreti
Re : [Résolu] Script non exécuté dans le cron
Quand on lance des scripts par crontab, c'est l'utilisateur à qui appartient la crontab qui est considéré.
C'est à dire que si on était logué en utilisateur "juju" sur le serveur, lorsque l'on a créé la tache dans la crontab, c'est la crontab de juju qui sera executé (sauf si on a fait un sudo).
Le répertoire de départ sera le $HOME de cet utilisateur, et le script héritera de son environnement.
Il est important dans ces conditions de mettre les chemins en absolu, ou de prendre ce postulat en considération, surtout si le script lancé utilise des fichiers ou répertoires, d'éviter les chemins relatifs (sauf pour des exe qui sont dans un path du $PATH) sauf si on est vraiment sûr de ce que l'on fait.
Loguer les actions peut aussi aider a diagnostiquer un problème :
*/5 * * * * /home/juju/developpements/monScript5mn.sh >> /home/juju/developpements/monScriptParCron.log 2>&1
De cette façon si on a un doute sur une variable d'environnement, dans l'objectif de déboguer on peut ajouter un printenv PATH ou printenv HOME (ou même un env) dans son script : le résultat se retrouvera dans le log, et cela permettra de connaitre l'état d'une variable d'environnement (ou de toutes les variables) qui peu(ven)t poser problème.
On peut même surveiller l'execution de son script par crontab en direct en faisant un
tail -f /home/juju/developpements/monScriptParCron.log
on obtient alors à l'écran une sortie tout à fait similaire à celle que l'on aurait en mode interactif.
N'utilisant pas la même distribution que vous (Gentoo), ni même X, je préfère m'en tenir à ces quelques généralités qui doivent être valables partout.
Dernière modification par carreti (Le 23/12/2015, à 09:57)
Utilisateur et administrateur de Linux et d'Unix (depuis le siècle dernier) et plus précisément ces dernières années de Linux Gentoo et de Windows 10 ...
Je cherche du boulot sur Paris et RP Ouest en administration système ou mieux dans la tierce maintenance applicative, middleware, base de données, flux ...
Hors ligne
#4 Le 23/12/2015, à 09:25
- credenhill
Re : [Résolu] Script non exécuté dans le cron
hello
préciser le chemin complet, /usr/local/bin n'est pas dans le PATH par défaut de cron
25 19 * * * /usr/local/bin/sendipp
Hors ligne
#5 Le 23/12/2015, à 11:07
- MicP
Re : [Résolu] Script non exécuté dans le cron
Les tâches cron ne sont PAS exécutées par l'interpréteur bash
mais par l'interpréteur de commandes dash (Debian Almquist Shell).
Vérifie les variables d'environnement utilisées par le script quand il est lancé par cron en ne mettant dans ton script que les deux lignes suivantes :
/bin/date >> /home/juju/developpements/retourCrontab.txt
/usr/bin/env >> /home/juju/developpements/retourCrontab.txt
Ensuite, vérifie le contenu du fichier qui aura été créé et qui sera modifié par l'exécution du script quand il est lancé par cron :
watch cat /home/juju/developpements/retourCrontab.txt
(Pour quitter la commande watch, entre la combinaison des touches Ctrl-c)
Tu pourra voir quelle est la valeur de la variable PATH
et de la variable SHELL => l'interpréteur de commandes utilisé.
Dernière modification par MicP (Le 23/12/2015, à 11:09)
Hors ligne
#6 Le 23/12/2015, à 11:29
- JujuLand
Re : [Résolu] Script non exécuté dans le cron
Bonjour,
préciser le chemin complet, /usr/local/bin n'est pas dans le PATH par défaut de cron
Oui, j'avais remarqué çà, et c'est pour çà que j'avais change en $(which sendipp), et çà fonctionne sur mon ordi.
Mon ordi est en 12.04, celui du copain en 14.04
Les seules différentes apparentes, en plus de la version ubuntu, étant que sur l'ordi du copain, j'interviens dans une session ssh, mais en fait, hormis le tty, je suis normalement considéré comme l'utilisateur local.
J'avais remarqué chez moi, que $USER n'était pas connu, et donc j'ai mis en dur toutes les variables initialisées pour le user
Et chez moi, çà fonctionne nickel
Pour simplifier, j'ai pris un autre script beaucoup simple:
printenv HOME
et dans le crontab, j'ai mis:
* 11 * * * $(which test) > /home/gavroche/crontab.log
Le contenu du log est vide (0 octet) et le contenu de syslog est :
Dec 23 11:22:01 XPS-8900 CRON[18588]: (gavroche) CMD ($(which test) > /home/gavroche/crontab.log)
Dec 23 11:23:01 XPS-8900 CRON[18971]: (gavroche) CMD ($(which test) > /home/gavroche/crontab.log)
Dec 23 11:24:01 XPS-8900 CRON[19330]: (gavroche) CMD ($(which test) > /home/gavroche/crontab.log)
Dec 23 11:24:50 XPS-8900 crontab[19637]: (gavroche) LIST (gavroche)
Dec 23 11:25:01 XPS-8900 CRON[19699]: (gavroche) CMD ($(which test) > /home/gavroche/crontab.log)
Bon, je viens de voir le post de MicP, mais je n'ai pas encore eu le temps de tester.
A+
Xubuntu 16.04 > Dell DM061 (2007) + Dell Inspiron 531 (2008)
Xubuntu 16.04 > Asus X51L (2009) + MSI GX723 (2009)
Xubuntu 22.04 > HP 15BA048NF (2018)
Hors ligne
#7 Le 23/12/2015, à 12:09
- JujuLand
Re : [Résolu] Script non exécuté dans le cron
Le test avec /usr/bin/env a retourné ceci:
mercredi 23 décembre 2015, 11:42:01 (UTC+0100)
HOME=/home/gavroche
LOGNAME=gavroche
PATH=/usr/bin:/bin
LANG=fr_FR.UTF-8
SHELL=/bin/sh
PWD=/home/gavroche
On remarque de suite que le path n'inclut pas /usr/local/bin.
Bon, après test, il s'avère que mon script plantait sous 14.04
En voici le contenu originel :
if test -z $MAINTENANCE;then
export MAINTENANCE=adresse.mail@provider
fi
if test -z $USER;then
export USER=alain
fi
. myipl
. myipp
echo "## ;$USER@$(hostname) ;$(date +'%Y-%m-%d %k:%M') ;$PUBLIC_IP ;$LOCAL_IP" |mail -s "@@$USER@$(hostname) $(date +'%Y-%m-%d %k:%M')" $MAINTENANCE
Cà a fonctionné des que j'ai eu modifié les lignes de la façon suivante:
. /usr/local/bin/myipl
. /usr/local/bin/myipp
Ce qui m'a troublé, c'est que çà ne posait aucun problème sous Ubuntu 12.04
Mais ce qui aussi est troublant, c'est que sous 14.04, on ait ce résultat:
gavroche@XPS-8900:~$ dash
$ which sendipp
/usr/local/bin/sendipp
$ which myipl
/usr/local/bin/myipl
$ which myipp
/usr/local/bin/myipp
J'ai enfin fait quelques essais complémentaires:
* 12 * * * $(which sendipp)
ne fonctionne pas malgré le test positif précédent en console sous dash ???
#!/bin/dash
. myipl
.myipp
ne plantent plus le script quand on utilise dash, mais les variables qui auraient du être mises à disposition LOCAL_IP et PUBLIC_IP ne sont pas disponibles.
Peut-être parce que myipl et myipp utilisent bash et non dash ?
Merci
A+
Dernière modification par JujuLand (Le 23/12/2015, à 12:28)
Xubuntu 16.04 > Dell DM061 (2007) + Dell Inspiron 531 (2008)
Xubuntu 16.04 > Asus X51L (2009) + MSI GX723 (2009)
Xubuntu 22.04 > HP 15BA048NF (2018)
Hors ligne
#8 Le 23/12/2015, à 12:25
- MicP
Re : [Résolu] Script non exécuté dans le cron
Dans les premières lignes de ton script (voire même la première), tu aurais pu mettre la ligne suivante :
PATH="/usr/local/bin:$PATH"
De cette façon, le chemin /usr/local/bin aurait été ajouté aux chemins de la variable PATH.
La variable PATH résultante aurait été :
/usr/local/bin:/usr/bin:/bin
De cette façon, tu n'aurais pas eu besoin de modifier les deux lignes de commandes suivantes :
. myipl
. myipp
Ni toute autre ligne du script faisant appel à une commande qui aurait nécessité de spécifier ce chemin.
Dernière modification par MicP (Le 23/12/2015, à 12:29)
Hors ligne
#9 Le 23/12/2015, à 12:33
- JujuLand
Re : [Résolu] Script non exécuté dans le cron
Oui, bien vu ...
J'ai modifié le dernier point concernant les vaiables fournies par myipl et myipp.
La réponse à la dernière question est-elle contenue dans la question ?
Merci
A+
Xubuntu 16.04 > Dell DM061 (2007) + Dell Inspiron 531 (2008)
Xubuntu 16.04 > Asus X51L (2009) + MSI GX723 (2009)
Xubuntu 22.04 > HP 15BA048NF (2018)
Hors ligne
#10 Le 23/12/2015, à 12:35
- JujuLand
Re : [Résolu] Script non exécuté dans le cron
Je viens de modifier myipl, et çà confirme que des scripts appelés depuis le script mis dans le crontab et qui fournissent des variables, doivent aussi exécutées sous dash.
A+
Xubuntu 16.04 > Dell DM061 (2007) + Dell Inspiron 531 (2008)
Xubuntu 16.04 > Asus X51L (2009) + MSI GX723 (2009)
Xubuntu 22.04 > HP 15BA048NF (2018)
Hors ligne
#11 Le 23/12/2015, à 12:39
- JujuLand
Re : [Résolu] Script non exécuté dans le cron
Dernier essai, je viens de refaire un test en repassant les trois script concernés sous bash et non dash, et avec les chemins complets, tout fonctionne correctement.
Merci
A+
Xubuntu 16.04 > Dell DM061 (2007) + Dell Inspiron 531 (2008)
Xubuntu 16.04 > Asus X51L (2009) + MSI GX723 (2009)
Xubuntu 22.04 > HP 15BA048NF (2018)
Hors ligne