在 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. 避坑要点:注意环境变量缺失、权限不足、路径错误三大常见问题。
相关推荐
曦夜日长21 小时前
MySQL系统篇,安装部署(一):CentOS 7 下从卸载到登录的完整实战
数据库·mysql·centos
虎头金猫2 天前
从上传PPT到观众远程打开互动页面:Claper在CentOS 7上的Docker部署、互动组件设置与固定访问地址实战
linux·运维·网络·人工智能·docker·centos·powerpoint
深蓝电商API2 天前
爬虫任务调度:从crontab到Airflow的进阶路线
爬虫·crontab·airflow
xiaoqiMikko2 天前
Linux 实战(九·完):重定向、sudo、通配符的坑 + 报错速查表 —— 三台真机实测
linux·centos
骑着蜗牛撵大象3273 天前
CentOS 7 单机拉起 Elasticsearch 7.17.29:从内核报错到公网可达的全链路记录
elasticsearch·centos·jenkins·restful·内核调优·公网部署
打工仔折腾 AI3 天前
CentOS 7 单机部署 Elasticsearch 7.17.29:启动报错排查与 CRUD 验证
人工智能·后端·python·elasticsearch·性能优化·centos·jenkins
mengchanmian3 天前
VSFTP 服务器搭建(Centos)
运维·服务器·centos
承渊政道4 天前
CentOS 7单机部署Elasticsearch 7.17.29:从启动报错、CRUD验证到固定公网地址的完整过程
linux·elasticsearch·centos·内网穿透·cpolar·单机部署
xiaoqiMikko5 天前
Linux 实战(七):useradd、sudoers、umask、SGID、软链 —— 三台真机实测
linux·centos
Mikko75 天前
Linux 重启后日志没了?进程被 OOM 杀了去哪看?logrotate 之后日志还往旧文件写?三台真机实测日志与性能排查
linux·运维·centos