使用crontab完成定时任务
crond是linux下用来周期性的执行某种任务或等待处理某些事件的一个守护进程,与windows下的计划任务类似,当安装完成操作系统后,默认会安装此服务工具,并且会自动启动crond进程,crond进程每分钟会定期检查是否有要执行的任务,如果有要执行的任务,则自动执行该任务
语法
usage: crontab [-u user] file
crontab [-u user] [ -e | -l | -r ]
-e (执行文字编辑器来设定时程表,内定的文字编辑器是 vi)
-l (列出user的时间表)
-r (删除user的时间表)
root用户的任务调度操作可以通过crontab –u root –e
来设置,也可以将调度任务直接写入/etc/crontab
文件
cron表达式
cron表达式是一个字符串,包含五个到七个由空格分隔的字段,表示一组时间,通常作为执行某个程序的时间表
minute hour day month week command
minute: 表示分钟,可以是从0到59之间的任何整数
hour:表示小时,可以是从0到23之间的任何整数
day:表示日期,可以是从1到31之间的任何整数
month:表示月份,可以是从1到12之间的任何整数
week:表示星期几,可以是从0到7之间的任何整数,这里的0或7代表星期日
command:要执行的命令,可以是系统命令,也可以是自己编写的脚本文件
* * * * * command
- - - - -
| | | | |
| | | | +----- 星期中星期几 (0 - 7) (星期天 为0)
| | | +---------- 月份 (1 - 12)
| | +--------------- 一个月中的第几天 (1 - 31)
| +-------------------- 小时 (0 - 23)
+------------------------- 分钟 (0 - 59)
星号(*):代表所有可能的值,如month字段为星号,则表示每月都执行该命令操作
逗号(,):可以用逗号隔开的值指定一个列表范围,例如,“1,2,5,7,8,9”
中杠(-):可以用整数之间的中杠表示一个整数范围,例如“2-6”表示“2,3,4,5,6”
正斜线(/):可以用正斜线指定时间的间隔频率,例如“*/2”表示每两小时执行一次
实例
- 每一分钟执行一次 /bin/ls
* * * * * /bin/ls
- 在 12 月内, 每天的早上 6 点到 12 点,每隔 3 个小时 0 分钟执行一次
/usr/bin/backup
0 6-12/3 * 12 * /usr/bin/backup
- 每天22:50关闭ssh服务
50 22 * * * /sbin/service sshd stop
- 在
/etc/crontab
中添加环境变量,在可执行命令之前添加命令. /etc/profile;/bin/sh
,使得环境变量生效
20 03 * * * . /etc/profile;/bin/sh test.sh
注意点
- crontab有2种编辑方式:直接编辑/etc/crontab文件与crontab –e,其中/etc/crontab里的计划任务是系统中的计划任务,而用户的计划任务需要通过crontab –e来编辑
- crontab中的command尽量使用绝对路径,否则会经常因为路径错误导致任务无法执行
- 新创建的 cron 任务不会马上执行,至少要过 2 分钟后才可以,可以重启 cron 来马上执行
- %在crontab文件中表示换行,因此假如脚本或命令含有%,需要使用\%来进行转义
Mac 下使用crontab遇到的问题
我有一个Python爬虫脚本,在命令行时可以正常工作,但在crontab下报错
can't open file ... [Errno 1] Operation not permitted
cron表达式如下
30 7 * * * /usr/local/bin/python3 script.py >> script.log 2>&1
尝试了许多不同的方法,包括尝试过赋予文件权限,以root用户身份创建cron作业,不同的Python路径,都不能正常运行
最后在Stack Overflow找到解决方案
赋予cron
全磁盘访问权限,方法如下
- 系统偏好设置->安全和隐私->完整磁盘访问
- 解除锁定以允许更改
- 单击 +
- 单击Command + Shift + G输入
/ usr / sbin
- 找到
cron
添加
参考
Trying to run a Python script with cron Operation not permitted