Python em Su Cron fornece uma saída diferente da execução manual
Pergunta
Ubuntu Server 9.10, aqui está o meu arquivo, test.py
import commands
blkid = commands.getoutput('blkid')
print blkid
Quando eu corro manualmente (como su) isto:
python test.py
Eu recebo a saída do blkid como esperado:
/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"
No entanto, quando eu adiciono isso ao meu su Crontab:
* * * * * python /home/myusername/test.py > /home/myusername/output
O conteúdo de resultado torna-se:
sh: blkid: not found
O que estou perdendo aqui? É o python comandos Módulo apenas para certos comandos específicos de SH? Estou apenas tentando executar um comando do sistema e capturar a saída em uma variável que posso analisar.
Solução
O problema provavelmente está com o seu $PATH
versus root (os.environ['PATH']
Se você está olhando para isso em Python em vez de Shell ;-). O caminho de Root é tipicamente muito conservador (seria arriscado para não ser!) E como você está correndo blkid
sem especificar um caminho absoluto que pode significar facilmente que está no seu caminho, mas não no root.
Então faz which blkid
Como você mesmo em um prompt de shell, sudo su
ou de qualquer maneira se tornam raiz, e echo $PATH
- Você pode verificar rapidamente o problema. Então você o conserta usando o caminho completo absoluto do BLKID no getoutput
ligue em vez de apenas o identificador nu blkid
Como você está fazendo agora.
Outras dicas
O ambiente (e o caminho) de um trabalho de Cron não é necessariamente o mesmo que o seu shell de login.