Fonctionnement cron

Bonjour

J’ai un script script.sh dans /etc/cron.daily qui appelle un script python script.py situe dans /home/moi/bin… jusque la tout va bien.

Le probleme vient d’une ligne du script python (os.environ[‘USER’]) qui est sense me retourner le nom de l’utilisateur executant le script. Or le script me renvoie une erreur quand il est execute par cron dans cron.daily :

Traceback (most recent call last): File "/home/user/script", line 11, in <module> f.write('user = ' + os.environ['USER']) File "/usr/lib/python2.6/UserDict.py", line 22, in __getitem__ raise KeyError(key) KeyError: 'USER'

L’erreur n’est pas une erreur python mais plutot vient de ma (non-)comprehension de comment s’execute le script dans cron.daily car le script s’execute sans probleme dans le shell (user ou root), appeler directement ou pas (/etc/cron.daily/script.sh ou /home/user/bin/script.py).

Le KeyError signifie que la clef USER du dictionnaire os.environ soit n’existe pas, soit n’a pas de valeur valide. Quelqu’un a t il une explication ? :unamused:

Merci

À mon avis, les scripts placés dans /etc/cron.daily sont éxécutés par root, ou un utilisateur “cron”.
Pour que ce soit un utilisateur lambda qui lance le script périodiquement, il faut lancer la commande en tant que cet utilisateur :

Puis remplir le fichier, par exemple ainsi :

# For example, you can run a backup of all your user accounts
# at 5 a.m every week with:
# 0 5 * * 1 tar -zcf /var/backups/home.tgz /home/
# 
# For more information see the manual pages of crontab(5) and cron(8)
# 
# m h  dom mon dow   command
#récupération mails
*/5 * * * * fdm fetch >> $HOME/Maildir/fdm.log

Non meme en specifiant l’utilisateur avec /etc/cron.d/anacron ou crontab : ca ne marche pas ! :confused:

Je ne connais pas python, mais je suppose que os.environ[‘USER’] récupère la variable USER dans l’environnement.

Quand tu es dans un shell, elle est définie (env | grep USER), mais pas dans cron.
Il te faut donc adapter ton script.sh, par exemple :

#!/bin/sh
export USER=<ton_user>
python /chemin/vers/script.py

Ou éviter complètement la variable $USER qui n’est de toute évidence pas fiable, et utiliser directement un des outils prévus pour récupérer le nom d’utilisateur : whoami / id -un

[quote=“kna”]Quand tu es dans un shell, elle est définie (env | grep USER), mais pas dans cron.
Il te faut donc adapter ton script.sh, par exemple :

#!/bin/sh export USER=<ton_user> python /chemin/vers/script.py [/quote]
C’etait exactement ca ! :041
Merci

[quote=“syam”]Ou éviter complètement la variable $USER qui n’est de toute évidence pas fiable, et utiliser directement un des outils prévus pour récupérer le nom d’utilisateur : whoami / id -un[/quote]En fait, le but n’etait pas de recuperer l’utilisateur mais de le definir donc je prefere la solution de kna. Mais j’ai une question pour toi : pourquoi pas fiable ? La c’est moi qui faisait une erreur, non ? :108