为什么Python脚本在CLI中正常工作,但从cron作业调用时不行?

3 投票
2 回答
1219 浏览
提问于 2025-04-16 09:54

我写了一个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为脚本提供了一个环境,这个环境和你平常使用的用户环境是不一样的。

撰写回答