在 CentOS 7 系统中通过定时任务自动执行 Shell 脚本

在 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

重要补充:路径与输出重定向

  1. 绝对路径优先 :脚本、命令、日志文件必须使用绝对路径,crontab 运行时环境变量极简,相对路径会导致执行失败。

  2. 捕获执行日志 :建议添加输出重定向,排查任务异常:

    bash 复制代码
    # 标准输出和错误输出都写入日志文件
    * * * * * /home/test.sh >> /home/test_cron.log 2>&1
    • >>:追加写入日志
    • 2>&1:将错误输出重定向到标准输出,统一记录

三、crontab 常用管理命令

bash 复制代码
# 查看当前用户的定时任务列表
crontab -l

# 删除当前用户所有定时任务(谨慎使用)
crontab -r

# 编辑其他用户的定时任务(root权限执行)
crontab -u 用户名 -e

四、常见问题排查方案

1. 任务未执行/日志无输出

  1. 检查 crond 服务:确认服务已启动并开机自启

  2. 检查脚本权限 :确认脚本有x执行权限,执行用户有文件读写权限

  3. 检查路径问题:所有路径均为绝对路径

  4. 查看系统日志 :crontab 执行记录会写入系统日志,排查核心命令:

    bash 复制代码
    # 查看定时任务执行日志
    tail -f /var/log/cron

    日志中会记录任务触发时间、执行用户、执行命令,快速定位失败原因。

2. 环境变量问题

crontab 不会加载用户的 .bashrc/.bash_profile,若脚本依赖自定义环境变量,两种解决方案:

  1. 在脚本开头手动加载环境变量:

    bash 复制代码
    #!/bin/bash
    source /etc/profile
    source ~/.bashrc
    # 后续业务逻辑
  2. 在 crontab 配置顶部定义环境变量:

    bash 复制代码
    PATH=/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 服务生效。


总结

  1. 核心工具:CentOS 7 依赖 crond 服务 + crontab 命令实现定时任务,需先保证服务运行;
  2. 核心规范:脚本必须加执行权限、所有路径用绝对路径、建议添加日志重定向排查问题;
  3. 常用操作:crontab -e 编辑任务、crontab -l 查看任务、/var/log/cron 排查执行日志;
  4. 避坑要点:注意环境变量缺失、权限不足、路径错误三大常见问题。
相关推荐
Web极客码2 小时前
CentOS 7.x如何快速升级到CentOS 7.9
linux·运维·centos
Lw老王要学习3 小时前
CentOS 7.9达梦数据库安装全流程解析
linux·运维·数据库·centos·达梦
CRUD酱4 小时前
CentOS的yum仓库失效问题解决(换镜像源)
linux·运维·服务器·centos
丁劲犇1 天前
CentOS 7.6 TCP连接奇慢故障排查:中文注释引发的sysctl配置异常
linux·tcp/ip·centos·速度慢
AL3171 天前
模拟实现NetDevOps全生命周期自动化网络运维
运维·docker·centos·ensp·netmiko
daemon.qiang1 天前
mplayer使能支持vaapi
linux·centos
Pluto_CSND1 天前
CentOS系统中创建定时器
linux·运维·centos
礼拜天没时间.1 天前
Docker基础操作——镜像与容器管理
linux·运维·服务器·docker·容器·centos
ajole1 天前
Linux学习笔记——基本指令
linux·服务器·笔记·学习·centos·bash