Crontab|Linux 的定时任务

本文最后更新于:1 个月前

之前在 Gtihub Action|一行命令解决 LeanCloud 流控问题 中提到,我已经使用 crontab 命令代替 Github Action 帮我执行自动化任务了。

踩了一些坑,记录下来。

1.介绍

Linux 系统启动时,init 进程会启动 cron 进程,corn 会执行定时任务表 crontab 中的定时任务。所以只要系统开机,就会自动执行定时任务。

2.编辑

crontab有2种编辑方式:直接编辑 /etc/crontab 文件与 crontab –e,其中,

  • /etc/crontab 里的计划任务是系统中的计划任务。
  • crontab –e 用来编辑用户的计划任务。

每个用户都有自己的 crontab 文件,每次编辑完某个用户的 crontab 后,cron 自动在 /var/spool/cron 下生成一个与此用户同名的文件,此用户的 cron 信息都记录在这个文件中,这个文件是不可以直接编辑的,只可以用 crontab -e 来编辑。

2.格式

1
*    *    *    *    *  command

在以上各个字段中,还可以使用以下特殊字符:

  • * 代表所有的取值范围内的数字,如月份字段为 *,则表示每月;

  • / 代表每一定时间间隔的意思,如分钟字段为 */10,表示每10分钟执行1次。

  • - 代表从某个区间范围,是闭区间。如 “2-5” 表示 “2,3,4,5” ,小时字段中 0-23/2 表示在 0~23 点范围内每 2 个小时执行 1 次。

  • , 用于分散的数字(不一定连续),如1,2,3,4,7,9。

注:由于各个地方每周第一天不一样,因此Sunday=0(第一天)或Sunday=7(最后1天)。

3.启动

修改完后,终端提示 crontab: installing new crontab 后,就会自动执行。

如果不确定是否成功,可以用下面的任务测试一下。

1
* * * * * date "+\%D \%H:\%M:\%S" >> ~/test.log

4.停止

  • 在 macOS 中,cron 进程是无法停止的,使用 crontab -e 删除定时任务即可。
  • 在 ubunut 中,通过 service cron stop 可关闭 cron 服务。

注:删除定时任务时,记得每个用户都有自己的 crontab,如果发现定时任务没停止,sudo crontab -e 查看一下超级用户是否有定时任务。

5.易出现的问题

5.1 权限

定时任务执行过程中,可能有权限问题,比如读写文件等等,最好直接设定高级管理员的定时任务:sudo crontab -e

5.2 路径

crontab 中的 command 尽量使用绝对路径,否则会经常因为路径错误导致任务无法执行。

5.3 % 需转义

% 在crontab文件中表示 “换行”,因此假如脚本或命令含有 %,需要使用 % 来进行转义。

5.4 查看 cron log:

cron 运行日志在 /var/log/cron.log,如果没有找到是因为 ubuntu 默认没有开 cron 日志,开启日志的步骤如下。

1
2
3
4
# 1. 打开配置文件,找到cron.log相关行,将前面注释符#去掉,保存退出,重启rsyslog:
sudo vim /etc/rsyslog.d/50-default.conf
# 2.重启rsyslog
sudo service rsyslog restart

5.5 cron 任务不执行

现象:cron 任务不执行,查看 /var/log/cron.log,发现报错:MAIL (mailed 53 bytes of output but got status 0x004b from MTA#012)。

原因:

  • 定时任务中的命令,执行正确有内容需要输出,或执行错误有报错要输出。前者应该输出到标准输出 stdout,后者应该输出到标准错误输出 stderr。

  • stdout、stderr 都是显示器,但定时任务执行时是后台进程,没有显示器,所以系统就给你发邮件了,但是你系统邮件又没配置,邮件也发不出去。

  • (如果你配置了邮件,或者你是 macOS,终端输入 mail 命令,即可查看系统邮件。)

解决:

  • data &>> ~/my_cron.log 比如每次 data 执行完,不管 data命令执行正确还是执行错误,都将结果输出到 ~/my_cron.log 文件中保留。
  • 也可以重定向到黑洞,输出不保存在任何地方:data &>> /dev/null

更多:如果你想看看输出重定向,可以看这里 Linux 命令 | 输出重定向


本博客所有文章均个人原创,除特别声明外均采用 CC BY-SA 4.0协议,转载请注明出处!