Python dans cron SU donne autre sortie que l'exécution manuelle
Question
Ubuntu Server 9.10, Voici mon fichier, test.py
import commands
blkid = commands.getoutput('blkid')
print blkid
Quand je lance manuellement (en SU) suivante:
python test.py
Je reçois la sortie du blkid comme prévu:
/dev/sda1: UUID="3f0ac5bb-f0da-4574-81f5-77844530b561" TYPE="ext4"
/dev/sda5: UUID="67df0e7c-74fb-47dd-8520-ad720fbed67d" TYPE="swap"
/dev/sdb1: UUID="85466892-8dae-461c-95da-b8f91c2e766b" TYPE="ext3"
/dev/sdc1: UUID="91b84635-21c2-4d9a-84f8-2bbaab16d41f" SEC_TYPE="ext2" TYPE="ext3"
/dev/sdd1: UUID="6a52c830-0029-4154-80cb-f17274eb6fed" SEC_TYPE="ext2" TYPE="ext3"
Mais quand j'ajoute à mon crontab SU:
* * * * * python /home/myusername/test.py > /home/myusername/output
Le contenu de sortie devient:
sh: blkid: not found
Qu'est-ce que je manque ici? Est-ce le python commandes Module uniquement pour certaines commandes spécifiques à SH? J'essaie juste d'exécuter une commande de système et capturer la sortie dans une variable que je peux analyser.
La solution
Le problème est probablement avec votre $PATH
contre root (le os.environ['PATH']
si vous cherchez à en Python plutôt que shell ;-). PATH de racine est généralement très conservatrice (il serait risqué pour qu'il ne soit pas!) et que vous utilisez blkid
sans spécifier un chemin absolu qui peut facilement dire que ce soit sur votre PATH mais pas de racine.
Alors faites vous-même à which blkid
comme une invite du shell, ou de toute façon sudo su
devenir root, et echo $PATH
- vous pouvez vérifier rapidement le problème. Ensuite, vous le réparer en utilisant le chemin complet absolu de blkid dans l'appel plutôt que l'identifiant nu getoutput
blkid
que vous faites maintenant.
Autres conseils
L'environnement (et PATH) d'une tâche cron est pas nécessairement le même que votre shell de connexion.