一、 at:一次性计划任务
at [HH:MM] [yy-mm-dd]
>command
>(ctrl+d)
atq:查看任务
atrm:删除任务 后边指定要删除的任务号
时间格式也可以:now + count time-units (minutes, hours, days, weeks)
例:在当天的 21:30 时自动关闭当前系统
[root@localhost ~]# at 21:30
at> shutdown -h now
at> <EOT>
job 2 at Sun May 7 21:30:00 2017
[root@localhost ~]# atq
2 Sun May 7 21:30:00 2017 a root
[root@localhost ~]# atrm 2
[root@localhost ~]# atq
二、crontab周期性计划任务
crontab
是一个强大的工具,用于定期执行重复性任务。无论是备份数据、清理日志,还是定时发送邮件,crontab
都能让这些任务自动化。
crontab
(意为 "cron table")是用于配置 cron 守护进程 的命令行工具。cron 是一个在后台运行的服务,负责按照预设的时间表执行任务。通过编辑 crontab
文件,用户可以定义任务的执行时间和具体操作。
按照预先设置的时间周期(分钟、小时、天……)重复执行用户指定的命令操作,属于周期性计划任务
主要设置文件:
- 全局配置文件,位于文件:/etc/crontab
- 系统默认的设置,位于目录:/etc/cron.*/
- 用户定义的设置,位于文件:/var/spool/cron/用户名
格式:
crontab 的语法由 时间字段 和 命令 组成,格式如下:
* * * * * <要执行的命令>
│ │ │ │ │
│ │ │ │ └── 星期几 (0-7, 0和7均代表周日)
│ │ │ └──── 月份 (1-12)
│ │ └────── 日期 (1-31)
│ └──────── 小时 (0-23)
└────────── 分钟 (0-59)
- 前5个字段用于时间设定:分钟+小时+日期+月份+星期
- 最后一个字段用于指定具体的任务内容,可以是命令或者脚本
- 分钟 取值为从0到59之间的任意整数
- 小时 取值为从0到23之间的任意整数
- 日期 取值为从1到31之间的任意整数
- 月份 取值为从1到12之间的任意整数
- 星期 取值为从0到7之间的任意整数,0或7代表星期日
- 命令 要执行的命令或程序脚本
时间数值的特殊表示方法:
- * 表示该范围内的任意时间
- , 表示间隔的多个不连续时间点 (如 1,3,5)
- - 表示一个连续的时间范围 (如 1-5)
- / 指定间隔的时间频率 (如 */5 表示每5单位)
示例:
- 0 17 * * 1-5 周一到周五每天17:00
- 30 8 * * 1,3,5 每周一、三、五的8点30分
- 0 8-18/2 * * * 8点到18点之间每2小时
- 0 * */3 * * 每3天.......
常用操作:
编辑定时任务:
crontab -e [-u user_name]
编辑当前用户的 crontab 文件
查看任务列表:
crontab -l [-u user_name]
列出当前用户的所有定时任务
删除任务:
crontab -r [-u user_name]
删除当前用户的全部定时任务(谨慎使用!)
实用案例
每天凌晨 3 点备份数据库
0 3 * * * /usr/bin/mysqldump -u root -pPASSWORD database > /backup/db.sql
每 5 分钟执行一次 Python 脚本
*/5 * * * * /usr/bin/python3 /home/user/scripts/check_status.py
每周一早上 8 点清理日志
0 8 * * 1 /bin/rm -rf /var/log/app/*.log
常见问题与技巧
1. 环境变量问题
cron 任务的执行环境与用户登录时的环境不同,可能导致命令找不到(如 python
或 npm
)。建议使用绝对路径或在脚本中设置环境变量。
2. 日志记录
通过重定向输出到文件,方便调试:
* * * * * /path/to/script.sh >> /var/log/cron.log 2>&1
记录任务的输出,方便排查问题。
3. 权限管理
- 用户级任务:通过
crontab -e
配置。 - 系统级任务:需编辑
/etc/crontab
或使用/etc/cron.d/
。