在 CentOS 7 系统中通过定时任务自动执行 Shell 脚本,CentOS 7 默认使用 crontab 工具实现定时任务,这是系统自带、稳定可靠的方案,接下来完整讲解从脚本准备、权限配置到 crontab 编写、管理的全流程。
一、前置准备:编写可执行的 Shell 脚本
首先编写你的业务脚本,以 /home/test.sh 为例,脚本内容可以根据需求修改:
bash
#!/bin/bash
# 示例脚本:输出当前时间到日志文件,用于验证定时任务执行
echo "任务执行时间:$(date '+%Y-%m-%d %H:%M:%S')" >> /home/test_cron.log
关键配置:赋予脚本执行权限
CentOS 中脚本默认无执行权限,必须手动添加:
bash
chmod +x /home/test.sh
测试脚本可用性
先手动执行脚本,确认无报错、功能正常,避免定时任务执行失败:
bash
/home/test.sh
# 执行后查看日志,验证输出
cat /home/test_cron.log
二、CentOS 7 定时任务核心:crontab 服务
1. 检查 crond 服务状态
CentOS 7 采用 systemd 管理服务,定时任务依赖 crond 守护进程,先确认服务运行正常:
bash
# 查看服务状态
systemctl status crond
# 若未运行,启动服务
systemctl start crond
# 设置开机自启(推荐)
systemctl enable crond
# 重启服务(修改配置后可执行)
systemctl restart crond
2. crontab 时间格式规则
crontab 定时规则共6个字段,格式:
分 时 日 月 周 要执行的命令/脚本路径
| 字段 | 取值范围 | 说明 |
|---|---|---|
| 分 | 0-59 | 每分钟的第几分钟执行 |
| 时 | 0-23 | 每天的第几小时执行 |
| 日 | 1-31 | 每月的第几天执行 |
| 月 | 1-12 | 每年的第几月执行 |
| 周 | 0-7(0和7都代表周日) | 每周的星期几执行 |
常用通配符
*:代表所有可能的值(每分/每时/每日都执行)*/n:每隔n个单位执行一次,:指定多个离散时间点-:指定连续时间范围
3. 编辑定时任务
执行命令编辑当前用户的定时任务配置文件(推荐普通任务用普通用户,系统级任务用root):
bash
# 编辑当前用户定时任务
crontab -e
首次执行会提示选择编辑器,输入
1选择vim即可。
示例配置(写入配置文件)
结合前面的测试脚本,编写常用定时规则:
bash
# 1. 每分钟执行一次脚本
* * * * * /home/test.sh
# 2. 每天凌晨2点执行
0 2 * * * /home/test.sh
# 3. 每周日凌晨3点执行
0 3 * * 0 /home/test.sh
# 4. 每月1号、15号的10点执行
0 10 1,15 * * /home/test.sh
# 5. 工作日(周一至周五)18:00执行
0 18 * * 1-5 /home/test.sh
# 6. 每10分钟执行一次
*/10 * * * * /home/test.sh
重要补充:路径与输出重定向
-
绝对路径优先 :脚本、命令、日志文件必须使用绝对路径,crontab 运行时环境变量极简,相对路径会导致执行失败。
-
捕获执行日志 :建议添加输出重定向,排查任务异常:
bash# 标准输出和错误输出都写入日志文件 * * * * * /home/test.sh >> /home/test_cron.log 2>&1>>:追加写入日志2>&1:将错误输出重定向到标准输出,统一记录
三、crontab 常用管理命令
bash
# 查看当前用户的定时任务列表
crontab -l
# 删除当前用户所有定时任务(谨慎使用)
crontab -r
# 编辑其他用户的定时任务(root权限执行)
crontab -u 用户名 -e
四、常见问题排查方案
1. 任务未执行/日志无输出
-
检查 crond 服务:确认服务已启动并开机自启
-
检查脚本权限 :确认脚本有
x执行权限,执行用户有文件读写权限 -
检查路径问题:所有路径均为绝对路径
-
查看系统日志 :crontab 执行记录会写入系统日志,排查核心命令:
bash# 查看定时任务执行日志 tail -f /var/log/cron日志中会记录任务触发时间、执行用户、执行命令,快速定位失败原因。
2. 环境变量问题
crontab 不会加载用户的 .bashrc/.bash_profile,若脚本依赖自定义环境变量,两种解决方案:
-
在脚本开头手动加载环境变量:
bash#!/bin/bash source /etc/profile source ~/.bashrc # 后续业务逻辑 -
在 crontab 配置顶部定义环境变量:
bashPATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin * * * * * /home/test.sh
3. 权限问题
- 普通用户无法操作系统目录/文件,建议脚本和日志放在用户家目录
- 系统级定时任务(如服务重启、备份),使用
root用户配置 crontab
五、进阶:系统级定时任务(/etc/crontab)
除了用户级crontab,CentOS 7 还有系统全局定时任务配置文件 /etc/crontab,格式多了执行用户字段:
分 时 日 月 周 执行用户 命令/脚本
示例(root用户每天执行系统备份脚本):
bash
0 3 * * * root /home/backup.sh
修改后重启 crond 服务生效。
总结
- 核心工具:CentOS 7 依赖
crond服务 +crontab命令实现定时任务,需先保证服务运行; - 核心规范:脚本必须加执行权限、所有路径用绝对路径、建议添加日志重定向排查问题;
- 常用操作:
crontab -e编辑任务、crontab -l查看任务、/var/log/cron排查执行日志; - 避坑要点:注意环境变量缺失、权限不足、路径错误三大常见问题。