Crontab|Linux 的定时任务
之前在 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 |
|
在以上各个字段中,还可以使用以下特殊字符:
* 代表所有的取值范围内的数字,如月份字段为 *,则表示每月;
/ 代表每一定时间间隔的意思,如分钟字段为 */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 |
|
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 |
|
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 命令 | 输出重定向。