linux初级_定时任务

TJCcc 发布于 2025-11-06 27 次阅读


1. Cron 简介

Cron 是 Linux 系统内置的定时任务调度器,用于在固定时间、日期或间隔执行预定的命令或脚本。

2. Cron 服务管理

服务启停

# 查看 cron 服务状态
sudo systemctl status cron   # Debian/Ubuntu
sudo systemctl status crond  # CentOS/RHEL

# 启动 cron 服务
sudo systemctl start cron

# 停止 cron 服务
sudo systemctl stop cron

# 重启 cron 服务
sudo systemctl restart cron

# 设置开机自启
sudo systemctl enable cron

检查服务是否运行

# 方法1:检查进程
ps aux | grep cron

# 方法2:检查服务状态
systemctl is-active cron

3. Cron 配置文件

系统级 Cron 文件

/etc/crontab           # 系统定时任务配置文件
/etc/cron.d/           # 系统cron任务目录
/etc/cron.hourly/      # 每小时执行
/etc/cron.daily/       # 每天执行  
/etc/cron.weekly/      # 每周执行
/etc/cron.monthly/     # 每月执行

用户级 Cron 文件

/var/spool/cron/crontabs/  # 用户cron文件存储位置(不建议直接编辑)
crontab -l                 # 查看当前用户的cron任务

4. Crontab 命令

基本操作

# 编辑当前用户的cron任务
crontab -e

# 查看当前用户的cron任务
crontab -l

# 删除当前用户的所有cron任务
crontab -r

# 编辑指定用户的cron任务(需要root权限)
crontab -u username -e

# 从文件恢复cron任务
crontab mycronfile.txt

安全配置

/etc/cron.allow    # 允许使用cron的用户列表
/etc/cron.deny     # 禁止使用cron的用户列表

5. Cron 时间格式详解

基本格式

*    *    *    *    *    command_to_execute
-    -    -    -    -
|    |    |    |    |
|    |    |    |    +----- 星期几 (0 - 7) (0和7都代表周日)
|    |    |    +---------- 月份 (1 - 12)
|    |    +--------------- 日期 (1 - 31)
|    +-------------------- 小时 (0 - 23)
+------------------------- 分钟 (0 - 59)

特殊字符

字符含义示例说明
*任意值* * * * *每分钟执行
,值分隔符1,15 * * * *每小时的第1和第15分钟
-范围1-5 * * * *每小时1-5分钟
/步长*/10 * * * *每10分钟
@预设@daily每天执行

预设替代符

@reboot      # 系统启动时执行
@yearly      # 每年一次 (0 0 1 1 *)
@annually    # 同 @yearly
@monthly     # 每月一次 (0 0 1 * *)
@weekly      # 每周一次 (0 0 * * 0)
@daily       # 每天一次 (0 0 * * *)
@hourly      # 每小时一次 (0 * * * *)

6. 常用时间配置示例

分钟级任务

* * * * * command          # 每分钟执行一次
*/5 * * * * command        # 每5分钟执行一次
0,15,30,45 * * * * command # 每15分钟执行一次

小时级任务

0 * * * * command          # 每小时整点执行一次
30 * * * * command         # 每小时的30分执行一次
0 */2 * * * command        # 每2小时执行一次

天级任务

0 2 * * * command          # 每天凌晨2点执行一次
0 9,18 * * * command       # 每天上午9点和下午6点执行一次
30 1 * * * command         # 每天凌晨1点30分执行一次

周级任务

0 0 * * 0 command          # 每周日午夜整点执行一次
0 12 * * 1 command         # 每周一中午12点执行一次
0 3 * * 1-5 command        # 周一到周五凌晨3点执行一次

月级任务

0 0 1 * * command          # 每月1号午夜整点执行一次
0 6 15 * * command         # 每月15号早上6点执行一次
0 0 1 1 * command          # 每年1月1日午夜整点执行一次

7. 环境变量问题

常见问题

Cron 执行环境与用户登录环境不同,可能导致命令找不到。

解决方案

方法1:使用绝对路径

# 错误
* * * * * myscript.sh

# 正确
* * * * * /home/user/myscript.sh

方法2:在脚本中设置PATH

#!/bin/bash
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
# 你的命令...

方法3:在crontab中设置环境变量

# 在crontab文件开头设置
SHELL=/bin/bash
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
HOME=/home/username
LOGNAME=username

* * * * * /path/to/command

8. 输出处理

输出重定向

# 丢弃所有输出(不推荐)
* * * * * /path/to/command > /dev/null 2>&1

# 重定向到文件
* * * * * /path/to/command >> /var/log/mycommand.log 2>&1

# 标准输出和错误输出分开
* * * * * /path/to/command >> /var/log/stdout.log 2>> /var/log/stderr.log

邮件通知

# 禁用邮件通知(无输出时不发送)
* * * * * /path/to/command > /dev/null 2>&1

# 指定收件人(在crontab开头设置)
MAILTO="admin@example.com"

9. 实用技巧和最佳实践

调试技巧

# 1. 查看cron日志
sudo tail -f /var/log/syslog | grep cron    # Debian/Ubuntu
sudo tail -f /var/log/cron                  # CentOS/RHEL

# 2. 测试环境变量
* * * * * env > /tmp/cron_env.txt

# 3. 测试命令执行
* * * * * /path/to/command >> /tmp/cron_debug.log 2>&1

最佳实践

  1. 使用完整路径:所有命令和文件都使用绝对路径
  2. 设置正确的PATH:在脚本或crontab中明确设置PATH
  3. 处理输出:合理重定向输出,避免填满磁盘
  4. 设置权限:确保脚本有执行权限 chmod +x script.sh
  5. 测试脚本:先在命令行测试脚本,再添加到cron
  6. 添加注释:在crontab中添加注释说明任务用途
  7. 备份配置:定期备份crontab配置

错误排查清单

# 1. 检查脚本权限
ls -l /path/to/script.sh

# 2. 检查命令路径
which command_name

# 3. 检查cron服务状态
systemctl status cron

# 4. 查看cron日志
tail -f /var/log/syslog | grep cron

# 5. 手动测试命令
/path/to/command

# 6. 检查环境变量
crontab -l

10. 复杂示例

备份脚本示例

# 每天凌晨2点备份数据库
0 2 * * * /home/user/scripts/backup_db.sh >> /var/log/backup.log 2>&1

# 每周一凌晨3点清理临时文件
0 3 * * 1 /home/user/scripts/cleanup.sh >> /var/log/cleanup.log 2>&1

# 每月1号凌晨1点生成月度报告
0 1 1 * * /home/user/scripts/monthly_report.sh

监控脚本示例

# 每5分钟检查服务状态
*/5 * * * * /home/user/scripts/check_service.sh

# 每小时检查磁盘空间
0 * * * * /home/user/scripts/check_disk.sh

# 工作日工作时间每30分钟同步数据
*/30 9-17 * * 1-5 /home/user/scripts/sync_data.sh

总结

  • crontab -e 是管理个人定时任务的主要方式
  • 时间格式:分 时 日 月 周
  • 始终使用绝对路径
  • 合理处理输出和错误
  • 注意环境变量差异
  • 定期检查日志进行监控
  • 注意:定时任务中如果命令部分如果有%的,需要加“ \ ”,因为定时任务不认识%,又或者将该命令写入shell脚本中。