SU cron中的Python提供的输出与手动执行不同

时间:2010-03-05 03:10:16

标签: python cron sudo crontab

Ubuntu Server 9.10, 这是我的文件test.py

import commands
blkid = commands.getoutput('blkid')
print blkid

当我手动运行(作为SU)时:

python test.py

我按预期获得 blkid 的输出:

/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"

但是,当我将其添加到我的SU crontab时:

* * * * * python /home/myusername/test.py > /home/myusername/output

输出的内容变为:

sh: blkid: not found

我在这里缺少什么? Python 命令模块仅适用于某些特定于SH的命令吗?我只是尝试运行系统命令并将输出捕获到我可以解析的变量中。

2 个答案:

答案 0 :(得分:2)

问题可能在于你的$PATH与root的关系(os.environ['PATH'],如果你在Python而不是shell中查看它;-)。 root的PATH通常是非常保守的(它不会有风险!)并且因为你运行blkid而没有指定绝对路径,这可能很容易意味着它在你的PATH而不是root的。

所以which blkid在shell提示符下sudo su,或者无论如何成为root,echo $PATH - 你可以快速验证问题。然后你通过在getoutput调用中使用blkid的绝对完整路径来修复它,而不仅仅是你现在正在做的裸标识符blkid

答案 1 :(得分:0)

cron作业的环境(和PATH)不一定与登录shell相同。