-

Crontab小白踩了哪些坑

2022.08.30

作为一个Linux小白,博主前些天试图用crontab定时执行shell脚本来备份blog和图床,结果因为才疏学浅,把crontab能踩的坑全部踩了一遍,磕磕绊绊总算做好了备份。总结一下我的血泪史:

一、cron表达式

crontab表达式如下:

.---------------- minute (0 - 59)
|  .------------- hour (0 - 23)
|  |  .---------- day of month (1 - 31)
|  |  |  .------- month (1 - 12) OR jan,feb,mar,apr ...
|  |  |  |  .---- day of week (0 - 6) (Sunday=0 or 7) OR sun,mon,tue,wed,thu,fri,sat
|  |  |  |  |
*  *  *  *  * user-name command to be executed

需要注意的是这里只有5个配置位,5个✳,如果输入多了的话无法保存。
对了,表达式写好之后最好去这个网站反解析一下,确保没有搞错😵‍💫

二、时区设定

修改了系统时区,但是crontab时区不会随着变化,如果不修改crontab时区,虽然任务可以执行,但不是在“设定”的时间。
这时候需要添加crontab环境变量:
vim /etc/crontab
之后把CRON_TZ=Asia/Shanghai粘贴进去,保存退出即可。

三、环境变量

有时候命令在控制台可以执行,crontab无法执行,可能是crontab的PATH值和控制台不一致,用vim /etc/crontab进入修改PATH也没用,需要手动在crontab配置里面添加环境变量。
原配置如下:

0 6 * * * /root/halobackup.sh

加入环境变量后如下:

0 6 * * * . /etc/profile;/bin/sh /root/halobackup.sh

四、日志重定向

关于为什么要重定向,抄一段:

我们知道,如果crontab命令有输出内容的话,该输出内容会以邮件的形式发送给用户,内容存储在邮件文件/var/spool/mail/$user中。另外,我们也知道crontab功能是在一定的时间间隔调度一些命令来执行,如果命令执行比较频繁,如一分钟执行一次,或者命令数据内容较多,会使这个邮件文件不断追加内容,文件越来越大。而邮件文件一般存放在根分区,根分区一般相对较小,所以会造成根分区写满而无法登录服务器。

在配置最后添加>/dev/null 2>&1如下:

0 6 * * * . /etc/profile;/bin/sh /root/halobackup.sh >/dev/null 2>&1 & #最后的&表示后台运行

关于>/dev/null 2>&1表示什么意思,可以自己查查。

最后!
/etc/init.d/cron restart重启cron,定时任务生效。

以上算是我的备忘录。