在Python开发中,常常使用conda创建虚拟环境,编写Python程序。如果需要周期性的运行程序,当然可以自己实现,不过使用Linux系统的crontab命令可以更快捷。
Linux系统的crontab命令用来实现定时执行某些任务。
实际上,定时执行任务是由cron守护进程(crond
)来处理。cron
会读取一个或多个配置文件,其中包含有命令行及其调用时间。cron
的配置文件称为crontab
,是cron table
的简写。
crond
守护进程可以使用systemctl
程序来检查:
ststemctl start crond
# 启动systemctl status crond
# 检查ststemctl stop crond
# 停止crontab
命令用来实现提交定时任务与查看,其命令语法为:
crontab [-u user] file
或
crontab [-u user] [-l | -r | -e] [-i] [-s]
前一个命令用来提交一个定时任务,自然需要创建一个任务表。后者的主要参数为:
-e
: 运行编辑器来设定时程表(缺省是VI)-r
: 删除目前的时程表-l
: 列出目前的时程表主要的工作即使编写自己的crontab任务表文件。例如自己写的脚本文件sayhello.py
,希望每分钟都运行一次。那么创建一个crontab文件sayhello.cron
,在文件中添加:
1 * * * * python ~/pywork/sayhello.py
crontab任务表的格式如下:
# 注释行
f1 f2 f3 f4 f5 program
其中:
#
开始的行为注释行f1
表示分钟周期,范围 (0 - 59)f2
表示小时周期,范围(0-23)f3
表示月份中的日期,范围(1-31)f4
表示月份,范围(1-12)f5
表示星期中的第几天,范围(0-6)从星期日开始计数,也可使用sun,mon,tue,wed,thu,fri,sat
program
表示要执行的程序命令行通过分(minute)、时(hour)、日(day)、月(month)以及星期(week)这个5个要素来设置定时。
这些周期的常见的设置方法:
f1
为17,也就是在每小时的第17分钟开始执行;指定f2
为19,也就是在晚上7点钟开始执行,其它类推;*
表示每个周期都要执行。例如f3, f4
指定为*,表示每月的每一天都要执行;f5
为mon,fri
,表示每周一与周五开始执行任务;a-b
来指定某个时间段,例如指定f2
为13-15
表示要在从第13点 到15点都要执行;*/n
来表示按照某种间隔来执行。例如指定f2
为*/4
表示每4小时执行一次。# 每月每天每小时的第30分钟运行一次sayhello.py
30 * * * * python ~/pywork/sayhello.py
# 在冬季(12,1,2)月, 每天上午8点,每隔15 分钟运行sayhello.py
* /15 8 * 1,2,12 * python ~/pywork/sayhello.py
# 工作日每天晚上11点给老板汇报
0 11 * * mon,tue,wed,thu,fri mail -s "hi" boss@company.com < /tmp/maildata
任务表文件编写完毕后,使用crontab
命令提交:
crontab sayhello.cron
然后使用如下命令来查看:
crontab -l
普通用户提交的日志,通常存放在在目录中/var/spool/cron
下,需要超级用户才能查看;crontab
的日志记录存放在/var/log/cron
,也需要超级用户才能查看,而且不那么容易看。幸好自己通常会用logging写日志。
在实际工作中,通常使用Python虚拟环境来运行Python脚本。要在crontab
执行虚拟环境中的python脚本,只要使用Python的绝对路径就行,尽管会有些长。