python /home/myname/myscriptname.py
),它返回了我期望的正确值。这是我的cron命令-
10 * * * * /usr/bin/python /home/myname/myscriptname.py
当通过cron运行时,我得到以下输出(不正确)-('', None)
Module not enabled
当我通过命令行运行它时,我得到了以下(正确的)结果 -
The following people have the module enabled:
person1
person2
person3
怎么回事?我已经尝试使用完整路径调用每个命令(没有结果),并在crontab中添加以下内容 -
PATH=/sbin:/bin:/usr/sbin:/usr/bin:/usr/local/bin
,但是没有变化。问题可能出在哪里?当以拥有crontab的相同用户身份运行脚本时,它可以正常工作。
#!/usr/bin/python
import sys, os, subprocess
command = '/usr/local/bin/drush --alias-path=/data/scripts/drush_aliases @staging pml -y | /bin/grep -i dblog | /bin/grep -i enabled'
#Module Check
try:
process = subprocess.Popen(command, stdout=subprocess.PIPE, stderr=None, shell=True)
output2 = process.communicate()
print output2
if output2[0] == "":
staging_return = "Module not enabled"
else:
staging_return = "The following people have the module enabled: \n" + output2[0]
print staging_return
except Exception as E:
print E
print "Command failed"
编辑 - 这里是每个环境中os.environ的输出 -
这是在cron中os.environ的输出 -
{'LANG': 'en_US.UTF-8', 'SHELL': '/bin/sh', 'SHLVL': '1', 'PWD': '/home/myuser', 'LOGNAME': 'myuser', 'USER': 'myuser', 'HOME': '/home/myuser', 'PATH': '/sbin:/bin:/usr/sbin:/usr/bin:/usr/local/bin', '_': '/usr/bin/python'}
终端输出是 -
{'LESSOPEN': '||/usr/bin/lesspipe.sh %s', 'CVS_RSH': 'ssh', 'LOGNAME': 'myuser', 'USER': 'myuser', 'QTDIR': '/usr/lib64/qt-3.3', 'PATH': '/sbin:/bin:/usr/sbin:/usr/bin:/usr/local/bin', 'LANG': 'en_US.UTF-8', 'TERM': 'xterm', 'SHELL': '/bin/bash', 'SHLVL': '2', 'G_BROKEN_FILENAMES': '1', 'HISTSIZE': '1000', 'SUDO_USER': 'myuser', 'HOME': '/home/myuser', 'USERNAME': 'root', 'SUDO_UID': '860', '_': '/usr/bin/python', 'SUDO_COMMAND': '/bin/su', 'SUDO_GID': '860', 'HOSTNAME': 'MYHOSTNAME', 'PWD': '/home/myuser', 'MAIL': '/var/spool/mail/myuser',
Popen
调用中添加executable='/bin/bash'
,因为默认的cron shell是sh
。另外,请检查用户登录时的env
与脚本运行时的env
是否有差异。可能会有其他随机设置(例如,有时是PYTHONPATH
)。 - undefined