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 22/12/2015, à 21: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, à 13: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)

En ligne

#2 Le 23/12/2015, à 00: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
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, à 09: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, à 10: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, à 10: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, à 12: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, à 12:09)

Hors ligne

#6 Le 23/12/2015, à 12: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)

En ligne

#7 Le 23/12/2015, à 13: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, à 13: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)

En ligne

#8 Le 23/12/2015, à 13: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, à 13:29)

Hors ligne

#9 Le 23/12/2015, à 13: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 ? wink

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)

En ligne

#10 Le 23/12/2015, à 13: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)

En ligne

#11 Le 23/12/2015, à 13: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)

En ligne