使用crontab完成定时任务

使用crontab完成定时任务

crond是linux下用来周期性的执行某种任务或等待处理某些事件的一个守护进程,与windows下的计划任务类似,当安装完成操作系统后,默认会安装此服务工具,并且会自动启动crond进程,crond进程每分钟会定期检查是否有要执行的任务,如果有要执行的任务,则自动执行该任务

语法

1
2
3
4
5
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:要执行的命令,可以是系统命令,也可以是自己编写的脚本文件

1
2
3
4
5
6
7
8
*    *    *    *    * 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”表示每两小时执行一次

实例

  1. 每一分钟执行一次 /bin/ls
1
* * * * * /bin/ls
  1. 在 12 月内, 每天的早上 6 点到 12 点,每隔 3 个小时 0 分钟执行一次 /usr/bin/backup
1
0 6-12/3 * 12 * /usr/bin/backup
  1. 每天22:50关闭ssh服务
1
50 22 * * * /sbin/service sshd stop
  1. /etc/crontab 中添加环境变量,在可执行命令之前添加命令 . /etc/profile;/bin/sh,使得环境变量生效
1
20 03 * * * . /etc/profile;/bin/sh test.sh

注意点

  1. crontab有2种编辑方式:直接编辑/etc/crontab文件与crontab –e,其中/etc/crontab里的计划任务是系统中的计划任务,而用户的计划任务需要通过crontab –e来编辑
  2. crontab中的command尽量使用绝对路径,否则会经常因为路径错误导致任务无法执行
  3. 新创建的 cron 任务不会马上执行,至少要过 2 分钟后才可以,可以重启 cron 来马上执行
  4. %在crontab文件中表示换行,因此假如脚本或命令含有%,需要使用\%来进行转义

Mac 下使用crontab遇到的问题

我有一个Python爬虫脚本,在命令行时可以正常工作,但在crontab下报错

can’t open file … [Errno 1] Operation not permitted

cron表达式如下

1
30 7 * * * /usr/local/bin/python3 script.py >> script.log 2>&1

尝试了许多不同的方法,包括尝试过赋予文件权限,以root用户身份创建cron作业,不同的Python路径,都不能正常运行

最后在Stack Overflow找到解决方案

赋予cron全磁盘访问权限,方法如下

  1. 系统偏好设置->安全和隐私->完整磁盘访问
  2. 解除锁定以允许更改

  3. 单击 +

  4. 单击Command + Shift + G输入/ usr / sbin
  5. 找到cron 添加

参考

Linux crontab 命令

crontab用法与实例

Linux crontab命令详解

Trying to run a Python script with cron Operation not permitted