Linux Crontab定时运行python程序
背景:工作需要,凌晨定时运行一次py脚本。linux上可以直接使用crontab进行定时任务。
1、Crond命令详解
crond 是linux下用来周期性的执行某种任务或等待处理某些事件的一个守护进程,与windows下的计划任务类似
其中:
minute: 表示分钟,可以是从0到59之间的任何整数。
hour:表示小时,可以是从0到23之间的任何整数。
day:表示日期,可以是从1到31之间的任何整数。
month:表示月份,可以是从1到12之间的任何整数。
week:表示星期几,可以是从0到7之间的任何整数,这里的0或7代表星期日。
command:要执行的命令,可以是系统命令,也可以是自己编写的脚本文件
举个栗子:
#每天11.30运行脚本
30 11 * * * /home/aaa/test_main.sh
#每隔1分钟就运行一次脚本
*/1 * * * * /home/aaa/test_main.sh
#执行Python脚本
30 0 * * * /home/upload/anaconda3/bin/python /home/upload/py/test.py
2、Crond状态
首先参看 crond 状态
service crond status
如果关闭的话,就将其启动或者重启
服务操作说明
/sbin/service crond start //启动服务
/sbin/service crond stop //关闭服务
/sbin/service crond restart //重启服务
/sbin/service crond reload //重新载入配置
/sbin/service crond status //启动服务
常用方法
crontab -l #查看现有的所有 crontab 任务
crontab -e #添加或修改 crontab 任务(类似与vim)
3、Crond常见错误
Ⅰ、查看反馈
我在添加任务后,反馈 You have new mail in /var/spool/mail/upload。
这是相当于Crond的日志,如果脚本没有正常运行的话,可以去直接查看日志。
Ⅱ、python相对路径报错
遇到一个很诡异的事情:直接执行python脚本或把它放到shell脚本执行没啥问题,一放到crontab里执行就无反应。
解决办法:
crontab里执行时,直接把高版本python的全路径写上去,比如:
0 * * * * /usr/local/python3.6/bin/python home/community/test.py
运行crontab定时作业里边的东西,都要写绝对路径,python环境最好也写绝对路径
Ⅲ、脚本其他报错
直接运行 python test.py无问题,添加绝对路径到crontab里运行无反应。
打开 /var/spool/mail/upload 发现报错
SyntaxError: Non-ASCII character '\xe5' in file ex16.py on line 1,
ng declared; see http://python.org/dev/peps/pep-0263/ for details
解决办法:
在文件头部添加这一句即可 # -- coding: utf-8 -