Linux系统中定时执行任务是非常常见的需求,无论是服务器运维还是个人开发场景,都可以通过系统自带的工具实现自动化任务调度,不需要人工手动触发执行。

一、使用crontab实现周期性定时任务
crontab是Linux系统中最常用的周期性定时任务工具,适合需要重复执行的任务,比如每天凌晨执行数据备份、每小时同步一次文件等。所有用户都可以创建自己的crontab任务,系统级的定时任务则配置在/etc/crontab文件中。
1. crontab基本命令
常用的crontab操作命令如下:
- crontab -l:查看当前用户的定时任务列表
- crontab -e:编辑当前用户的定时任务,首次使用会提示选择编辑器
- crontab -r:删除当前用户的所有定时任务
- crontab -u 用户名 -l:查看指定用户的定时任务,需要root权限
2. crontab时间配置规则
crontab的每行任务由6个字段组成,前5个字段是时间配置,第6个字段是要执行的命令,格式如下:
| 字段位置 | 含义 | 取值范围 |
|---|---|---|
| 1 | 分钟 | 0-59 |
| 2 | 小时 | 0-23 |
| 3 | 日期 | 1-31 |
| 4 | 月份 | 1-12 |
| 5 | 星期 | 0-7(0和7都代表周日) |
| 6 | 执行命令 | 具体的命令或脚本路径 |
时间字段支持的特殊符号说明:
- *:代表所有可能的值,比如分钟字段为*表示每分钟都执行
- ,:分隔多个值,比如1,3,5表示第1、3、5分钟执行
- -:表示范围,比如1-5表示1到5的范围内都执行
- /:表示间隔频率,比如*/10表示每10个单位执行一次
3. crontab使用示例
下面是几个常见的crontab配置示例:
# 每分钟执行一次/test.sh脚本 * * * * * /bin/bash /test.sh # 每天凌晨2点执行数据备份脚本 0 2 * * * /bin/bash /home/backup/backup_data.sh # 每周一到周五的上午9点执行同步任务 0 9 * * 1-5 /usr/bin/rsync -av /local/data/ /remote/data/ # 每10分钟检查一次服务状态 */10 * * * * /usr/bin/systemctl status nginx > /tmp/nginx_status.log
需要注意,crontab执行任务时的环境变量和当前用户登录时的环境变量不同,如果脚本中用到自定义的环境变量,最好在脚本中显式声明,或者使用绝对路径调用命令。
二、使用at命令实现一次性定时任务
如果需要执行一次性的定时任务,比如10分钟后执行某个脚本,或者明天上午10点执行一次清理操作,可以使用at命令。at命令适合临时的一次性任务,执行完成后任务会自动删除。
1. at命令基本使用
首先确认at服务是否运行,如果没有运行需要先启动服务:
# 查看at服务状态 systemctl status atd # 启动at服务 systemctl start atd # 设置at服务开机自启 systemctl enable atd
at命令的基本用法是在at后面跟上时间,然后输入要执行的命令,最后按Ctrl+D结束输入。常用的时间格式如下:
- at now + 10 minutes:10分钟后执行
- at now + 1 hour:1小时后执行
- at 10:00 tomorrow:明天上午10点执行
- at 2024-05-20:指定日期的当前时间执行
2. at命令使用示例
下面是at命令的实际使用例子:
# 10分钟后执行清理日志命令 at now + 10 minutes at> rm -rf /tmp/*.log at> <EOT> # 这里按Ctrl+D输入结束 # 查看待执行的一次性任务 atq # 删除指定的at任务,任务编号通过atq查看 atrm 1
三、定时任务常见问题排查
如果定时任务没有按照预期执行,可以从以下几个方面排查:
- 检查定时任务服务是否正常运行,crontab对应crond服务,at对应atd服务
- 检查任务的时间配置是否正确,避免时间字段取值超出范围
- 检查执行的命令或脚本是否有可执行权限,脚本路径是否使用绝对路径
- 查看定时任务的执行日志,crontab的日志一般在/var/log/cron,at的日志在/var/log/at
- 可以在任务命令后添加日志输出,比如
*/1 * * * * /test.sh >> /tmp/test.log 2>&1,方便排查错误
注意:如果定时任务执行的脚本中有输出内容,默认会发送邮件给当前用户,如果不需要可以重定向输出到/dev/null,或者配置MAILTO=""关闭邮件通知。