什么是crontab?

Cron是Linux定时任务守护进程,crontab是它的配置文件。简单说,可以设置”每天凌晨3点执行备份脚本”这种任务。


基本命令

1
2
3
4
crontab -e                   # 编辑当前用户的定时任务
crontab -l # 查看当前用户的定时任务
crontab -r # 删除所有定时任务
crontab -u username -l # 查看指定用户的任务

时间格式

Cron表达式由5个字段组成:

1
2
3
4
5
6
7
* * * * * 命令
│ │ │ │ │
│ │ │ │ └─ 星期几(0-7,0和7都是周日)
│ │ │ └─── 月份(1-12)
│ │ └───── 日期(1-31)
│ └─────── 小时(0-23)
└───────── 分钟(0-59)

常用时间示例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
# 每分钟执行
* * * * * command

# 每小时第0分钟执行
0 * * * * command

# 每天凌晨3点执行
0 3 * * * command

# 每周一早上8点执行
0 8 * * 1 command

# 每月1号凌晨执行
0 0 1 * * command

# 工作日(周一到周五)早上9点执行
0 9 * * 1-5 command

# 每15分钟执行一次
*/15 * * * * command

# 每2小时执行一次
0 */2 * * * command

# 每天上午9点到下午6点,每小时执行
0 9-18 * * * command

# 指定月份执行(7月1号)
0 0 1 7 * command

创建定时任务

示例1:每天凌晨3点备份

  1. 编辑任务:
1
crontab -e
  1. 添加一行:
1
0 3 * * * /home/user/backup.sh
  1. 保存退出(:wq

示例2:每5分钟检查服务

1
*/5 * * * * /home/user/check_service.sh > /dev/null 2>&1

> /dev/null 2>&1 表示不输出任何信息。

示例3:每天删除30天前的日志

1
0 2 * * * find /var/log -name "*.log" -mtime +30 -delete

环境变量问题

Cron环境变量和终端不同,脚本可能找不到命令。

解决方法1:使用完整路径

1
2
3
4
5
# 错误
0 3 * * * backup.sh

# 正确
0 3 * * * /home/user/backup.sh

解决方法2:在脚本开头导出环境

1
2
3
#!/bin/bash
source ~/.bashrc
# 你的命令

解决方法3:在crontab里设置PATH

1
2
PATH=/usr/local/bin:/usr/bin:/bin
0 3 * * * /home/user/backup.sh

日志和调试

重定向输出

1
2
3
4
5
# 记录输出到日志
0 3 * * * /home/user/backup.sh >> /var/log/backup.log 2>&1

# 错误和正常输出分开
0 3 * * * /home/user/backup.sh >> /var/log/backup.log 2>> /var/log/backup_error.log

查看定时任务日志

1
2
3
4
# 查看cron日志
tail -f /var/log/cron
# 或
journalctl -u cron

实用技巧

技巧1:防止重复执行(文件锁)

1
2
3
4
5
6
7
8
9
#!/bin/bash
LOCKFILE=/tmp/backup.lock
if [ -f "$LOCKFILE" ]; then
echo "任务正在运行"
exit 1
fi
touch "$LOCKFILE"
# 你的命令
rm "$LOCKFILE"

技巧2:执行成功后通知

1
0 3 * * * /home/user/backup.sh && echo "备份成功" | mail -s "通知" user@example.com

技巧3:任务执行时间记录

1
0 3 * * * echo "开始时间: $(date)" >> /var/log/backup.log && /home/user/backup.sh >> /var/log/backup.log 2>&1

常见问题

Q: 定时任务没执行?
A: 检查:

  1. 脚本路径是否正确
  2. 脚本是否有执行权限(chmod +x
  3. 环境变量是否完整
  4. 查看 /var/log/cron 日志

Q: 脚本可以手动执行但Cron不行?
A: 通常是环境变量问题,用完整路径或导出环境变量。

Q: 如何只执行一次?
A: 用 at 命令:

1
echo "backup.sh" | at 03:00

用户的crontab位置

编辑的任务保存在:

  • /var/spool/cron/用户名

系统级别任务在:

  • /etc/crontab(需要root权限)

总结

  • crontab -e 编辑,crontab -l 查看
  • 时间格式:分 时 日 月 周
  • 常用:0 3 * * * 每天凌晨3点,*/5 * * * * 每5分钟
  • 脚本用完整路径
  • 输出重定向到日志文件便于调试
  • 检查 /var/log/cron 排查问题

下一篇:系统监控(top/htop/ps)。