为什么Python脚本在CLI中正常工作,但从cron作业调用时不行?
我写了一个Python脚本,想在Ubuntu服务器上通过定时任务(cronjob)每天自动运行。
这个脚本在命令行中运行是这样的:
python /home/username/public_html/IDM_app/manage.py cleanUpPosts
从命令行调用时,脚本运行得很好。
但是,当我试图通过定时任务运行这个脚本时,它就不能正常工作了。日志文件显示脚本被请求了,但没有说明为什么脚本没有正常执行。
我在脚本中添加了Python的日志记录功能。当从命令行调用脚本时,日志记录正常工作。但从定时任务调用时,Python的日志记录却无法写入日志文件。
我怀疑问题出在定时任务没有正确运行脚本所需的环境。
我找不到定时任务的错误日志在哪里。
我创建了一个/var/log/cron.log
但这个文件似乎没有更新。
因为我认为问题可能和环境变量有关,所以我尝试让定时任务显示它自己的环境变量。
这是我的定时任务设置的样子:
$ crontab -u username -e
m h dom mon dow command
43 17 * * * /bin/sh python /home/username/public_html/IDM_app/manage.py cleanUpPosts
43 17 * * * python /home/username/public_html/IDM_app/manage.py cleanUpPosts
45 21 * * * echo "-----------------"; echo "import os; print os.environ" | python
47 21 * * * /bin/sh echo "------with shell-------"; echo "import os; printos.environ" | python
MAILTO=bryanw@nowhere.com
我以为它会输出到屏幕上,但并没有。那环境变量会输出到哪里呢?
不管怎样,这里是日志文件的内容:
# tail -n 5 /var/log/*.log
==> /var/log/auth.log <==
Jan 13 17:43:01 servername CRON[7901]: pam_unix(cron:session): session opened for user username by (uid=0)
Jan 13 17:43:01 servername CRON[7902]: pam_unix(cron:session): session opened for user username by (uid=0)
Jan 13 17:44:48 servername su[7909]: Successful su for root by username
Jan 13 17:44:48 servername su[7909]: + /dev/pts/0 username:root
Jan 13 17:44:48 servername su[7909]: pam_unix(su:session): session opened for user root by username(uid=1000)
==> /var/log/bootstrap.log <==
==> /var/log/cron.log <==
==> /var/log/daemon.log <==
==> /var/log/dpkg.log <==
==> /var/log/kern.log <==
==> /var/log/lpr.log <==
==> /var/log/mail.log <==
==> /var/log/mysql.log <==
==> /var/log/pycentral.log <==
==> /var/log/user.log <==
我还可以尝试什么,才能找出我的脚本为什么不能正常运行呢?
2 个回答
2
3 17 * * * /bin/sh python /home/username/public_html/IDM_app/manage.py cleanUpPosts
这一行看起来不太对。你似乎是把 python
当成了一个 shell 脚本来运行。
5
可能是因为crontab找不到python的可执行文件,虽然在命令行中可以找到,所以你需要写出python的完整路径。你可以通过以下方式获取这个路径:
which python
crontab为脚本提供了一个环境,这个环境和你平常使用的用户环境是不一样的。