Opposite is endless darkness

Crontab小白踩了那些坑

2025.08.17

作为一个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表示什么意思,可以自己查查。