
linux-tutorial 定时任务实战crontab 用法、格式与运维脚本落地【免费下载链接】linux-tutorial:penguin: Linux教程主要内容Linux 命令、Linux 系统运维、软件运维、精选常用Shell脚本项目地址: https://gitcode.com/GitHub_Trending/lin/linux-tutorial环境CentOSsystemd 体系crontab是 Linux 下最常用的周期性任务调度工具通过它可以在分钟、小时、日、月、周等任意时间粒度上周期性地执行系统指令或 Shell 脚本是日志分析、数据备份、时间同步、磁盘清理等日常运维工作的基础设施。本指南以 linux-tutorial 仓库中 docs/linux/ops/crontab.md 为核心完整讲解 crond 服务管理、crontab 命令与文件格式、字段语法与常用实例并结合仓库内的 mysql-backup.sh、set-ntp.sh、Custom_Rm.sh、syscheck.sh 等真实脚本演示如何把定时任务落到实际运维场景中。读完本文你将掌握 crond 服务的启停与自启配置、crontab 的三种写入方式、五字段表达式的完整语法并能独立编写周期性的备份与清理任务。crond 服务Linux 通过crond 服务来支持 crontab。crond 是常驻后台的守护进程每分钟醒来一次检查所有用户的任务表默认存放于/var/spool/cron/与/etc/crontab命中时间条件即执行对应命令。检查 crond 服务使用systemctl list-unit-files命令确认crond服务是否已安装$ systemctl list-unit-files | grep crond crond.service enabled如果输出为enabled表示该服务已被设置为开机自启且处于运行状态。若未安装可先通过yum -y install cronieCentOS 7 默认自带安装。crond 服务命令在 CentOS 6 等使用 SysV init 的系统中可使用传统命令开启开机自启chkconfig crond on。在 CentOS 7 及以上的 systemd 体系中推荐使用以下命令管理服务systemctl enable crond.service # 开启服务开机自动启动服务 systemctl disable crond.service # 关闭服务开机不会自动启动服务 systemctl start crond.service # 启动服务 systemctl stop crond.service # 停止服务 systemctl restart crond.service # 重启服务 systemctl reload crond.service # 重新载入配置 systemctl status crond.service # 查看服务状态实践要点修改/etc/crontab后建议执行systemctl reload crond.service或systemctl restart crond.service使配置即时生效。仓库中的 set-ntp.sh 在向/etc/crontab追加同步时间任务后就执行了systemctl restart crond.service来加载新配置。crontab 命令命令格式crontab [-u user] file crontab [-u user] [ -e | -l | -r ]参数说明-u user用来设定某个用户的 crontab 服务filefile 是命令文件的名字表示将 file 作为 crontab 的任务列表文件并载入 crontab。如果在命令行中没有指定这个文件crontab 命令将接受标准输入键盘上键入的命令并将它们载入 crontab-e编辑某个用户的 crontab 文件内容。如果不指定用户则表示编辑当前用户的 crontab 文件-l显示某个用户的 crontab 文件内容如果不指定用户则表示显示当前用户的 crontab 文件内容-r从/var/spool/cron目录中删除某个用户的 crontab 文件如果不指定用户则默认删除当前用户的 crontab 文件-i在删除用户的 crontab 文件时给出确认提示建议与-r联用防止误删。两种写入定时任务的方法用户级任务推荐日常使用在命令行输入crontab -e然后添加相应的任务存盘退出。该方式会写入当前用户对应的/var/spool/cron/用户名任务文件系统级任务直接编辑/etc/crontab文件即vi /etc/crontab添加相应的任务。该文件是系统级全局任务表其条目需要额外指定执行用户且只有 root 有权修改。两种方式的差异在下文crontab 文件格式中会进一步体现。仓库中 Custom_Rm.sh 演示了直接向/var/spool/cron/root追加任务条目的写法echo 0 0 * * * rm -rf $TRASH_DIR/* $CRON_FILE而 set-ntp.sh 则演示了追加到/etc/crontab的写法两种途径各有适用场景。crontab 文件crontab 要执行的定时任务都被保存在/etc/crontab文件中用户级任务则分散保存在/var/spool/cron/下。crontab 的文件格式如下分 时 日 月 周 [user] command标准字段字段是否必填允许值允许特殊字符Minutes是0–59*,-Hours是0–23*,-Day of month是1–31*,-Month是1–12 or JAN–DEC*,-Day of week是0–6 or SUN–SAT*,-字段书写规则星号*匹配该字段任意合法值例如*分钟表示每分钟都执行逗号用于分隔列表。例如在第 5 个字段星期几中使用MON,WED,FRI表示周一、周三和周五连字符定义范围。例如2000-2010表示 2000 年至 2010 年期间的每年包括 2000 年和 2010 年**斜杠/**配合星号表示步进间隔例如*/2表示每隔 2 个单位执行一次详见下文实例 4、实例 12除非用反斜杠\转义否则命令中的**百分号%**会被替换成换行符第一个百分号后面的所有数据都会作为标准输入发送给命令。因此若命令本身包含%如date %Y%m%d务必写成\%转义形式当“日”和“周”两个字段同时被指定为非*时两者是或的关系满足任一条件即执行这一点与直觉不同需特别注意。/etc/crontab 文件示例SHELL/bin/bash PATH/sbin:/bin:/usr/sbin:/usr/bin MAILTOroot # For details see man 4 crontabs # Example of job definition: # .---------------- minute (0 - 59) # | .------------- hour (0 - 23) # | | .---------- day of month (1 - 31) # | | | .------- month (1 - 12) OR jan,feb,mar,apr ... # | | | | .---- day of week (0 - 6) (Sunday0 or 7) OR sun,mon,tue,wed,thu,fri,sat # | | | | | # * * * * * user-name command to be executed # 每两个小时以root身份执行 /home/hello.sh 脚本 0 */2 * * * root /home/hello.sh与用户级任务五字段不同/etc/crontab中的系统级条目为六字段在执行命令前需要额外指定user-name如上例的root并可通过SHELL、PATH、MAILTO变量指定任务运行的 Shell 环境、命令搜索路径以及执行结果邮件的接收者。任务存储与审计用户通过crontab -e写入的任务保存在/var/spool/cron/用户名中root 可以通过crontab -u 用户名 -l查看任意用户的任务。仓库中的系统巡检脚本 syscheck.sh 演示了这一审计思路它遍历/var/spool/cron/*用ls提取每个任务文件的属主并用egrep -v ^$|^#过滤空行和注释行后输出所有生效的定时任务配置形成定时任务配置巡检报告可作为人工核对机器上到底挂了哪些 cron 任务的快速手段。crontab 实例以下实例中myCommand代表要执行的命令或脚本路径/etc/init.d/smb restart代表重启 Samba 服务的典型操作均可替换为实际业务命令。实例 1每 1 分钟执行一次 myCommand* * * * * myCommand实例 2每小时的第 3 和第 15 分钟执行3,15 * * * * myCommand实例 3在上午 8 点到 11 点的第 3 和第 15 分钟执行3,15 8-11 * * * myCommand实例 4每隔两天的上午 8 点到 11 点的第 3 和第 15 分钟执行3,15 8-11 */2 * * myCommand实例 5每周一上午 8 点到 11 点的第 3 和第 15 分钟执行3,15 8-11 * * 1 myCommand实例 6每晚的 21:30 重启 smb30 21 * * * /etc/init.d/smb restart实例 7每月 1、10、22 日的 4:45 重启 smb45 4 1,10,22 * * /etc/init.d/smb restart实例 8每周六、周日的 1:10 重启 smb10 1 * * 6,0 /etc/init.d/smb restart注意周字段中0和7均代表周日此处6,0即周六和周日。实例 9每天 18:00 至 23:00 之间每隔 30 分钟重启 smb0,30 18-23 * * * /etc/init.d/smb restart实例 10每星期六的晚上 11:00 重启 smb0 23 * * 6 /etc/init.d/smb restart实例 11每一小时重启 smb0 * * * * /etc/init.d/smb restart实例 12晚上 11 点到早上 7 点之间每隔一小时重启 smb0 23-7 * * * /etc/init.d/smb restart该写法等价于0 23,0,1,2,3,4,5,6,7 * * *利用23-7跨小时范围结合整点执行实现夜间每小时触发。仓库实战把 crontab 用于备份与清理掌握了基础语法后来看 linux-tutorial 仓库中几个真实落地的 cron 应用它们完整展示了写脚本 → 挂 cron → 验证的闭环。实战一MySQL 定时备份仓库中的 mysql-backup.sh 是一个完整的 MySQL 备份脚本其文件头注释直接给出了接入 crond 的标准做法# 可以通过 crond 服务设置称为定时执行脚本 # 1执行 crontab -e 编辑定时执行任务如59 23 * * * /home/scripts/mysql-backup.sh # 2vi /etc/crontab编辑 crontab 文件后保存可以通过 crontab -l 查看脚本主体通过环境变量配置备份参数ENV_MYSQL_HOST数据库主机、ENV_MYSQL_PORT端口、ENV_MYSQL_USERNAME/ENV_MYSQL_PASSWORD账号密码、ENV_BACKUP_MAX_NUM保留的最大备份份数、ENV_MYSQL_DATABASES备份范围支持--all-databases全库备份或指定库列表、ENV_MYSQL_BACKUP_DIR备份输出目录随后 source lib/mysql.sh 中的backupMysql函数完成备份。将其挂入 crontab 的方式为# 每晚 23:59 执行 MySQL 全库备份 crontab -e 59 23 * * * /home/scripts/mysql-backup.sh注意两点脚本使用BASH_SOURCE[0]定位自身目录并 source 同级lib/下的函数库因此 cron 中务必使用绝对路径调用脚本同时建议在脚本内显式export各环境变量该脚本正是这样做的避免 cron 精简环境PATH通常只有/usr/bin:/bin下命令找不到的问题。实战二每天凌晨自动清理回收站仓库中的 Custom_Rm.sh 实现了一个自定义 rm把rm重定向为将文件移入$HOME/.TRASH_DIR的脚本避免误删。而回收站的定期清理由 cron 完成CRON_FILE/var/spool/cron/root ... echo 0 0 * * * rm -rf $TRASH_DIR/* $CRON_FILE即每天 0 点整执行rm -rf $TRASH_DIR/*清空回收站目录。这个实例说明cron 不仅能执行备份这类创建型任务也适合执行清理这类回收型任务是磁盘空间维护的常见手法。实战三NTP 自动定时同步时间仓库中的 set-ntp.sh 在配置 NTP 时间同步时除了立即执行一次ntpdate还通过 cron 实现持续自动同步echo * 3 * * * /usr/sbin/ntpdate ntp.sjtu.edu.cn /etc/crontab systemctl restart crond.service即每天 3 点执行一次 NTP 对时写入系统级任务文件/etc/crontab后重启 crond 服务使其生效。这正是前文修改/etc/crontab后需要 reload/restart crond的实例佐证。实战四定时归档与巡检仓库 codes/linux/tool/ 下还提供了两个可直接配合 cron 使用的归档脚本Daily_Archive.sh读取配置文件默认/home/tiandi/archive/Files_To_Backup中的待备份文件清单跳过不存在的文件并给出行号提示最终以tar -czf生成带日期后缀archive%y%m%d.tar.gz的压缩包Hourly_Archive.sh按小时/月/日目录层级归档每天按小时生成archive时分.tar.gz。把它们挂入 cron 即可形成周期性归档策略例如# 每天凌晨 2 点做一次日归档 0 2 * * * /path/to/Daily_Archive.sh # 每小时的第 30 分钟做一次小时归档 30 * * * * /path/to/Hourly_Archive.sh此外巡检脚本 syscheck.sh 遍历/var/spool/cron/*输出全部生效定时任务可用于定期自检机器上的 cron 配置是否符合预期避免僵尸定时任务长期占用资源。常见问题与使用建议cron 中脚本执行但结果与手动运行不一致多为环境变量差异所致。cron 默认PATH/usr/bin:/bin建议在脚本头部显式指定#!/usr/bin/env bash并export关键变量或像 mysql-backup.sh 那样在脚本内集中配置命令中包含%必须转义为\%否则%会被替换为换行并触发标准输入注入输出与日志cron 默认会把任务输出通过邮件发送给MAILTO指定用户默认 root。日常可重定向到日志文件如0 2 * * * /path/backup.sh /var/log/backup.log 21便于排障与审计服务未生效修改/etc/crontab后执行systemctl restart crond.service用户级任务则无需重启crond 每分钟自动重读任务文件删除任务要谨慎使用crontab -r -i组合-i会在删除前要求确认防止误删整张任务表。参考资料本文主题文档docs/linux/ops/crontab.md系统运维目录docs/linux/ops/README.md相关脚本MySQL 备份 mysql-backup.sh、NTP 同步 set-ntp.sh、自定义 rm Custom_Rm.sh、日归档 Daily_Archive.sh、小时归档 Hourly_Archive.sh、系统巡检 syscheck.shman 5 crontab/man 1 crontab系统手册命令与文件格式的最权威依据【免费下载链接】linux-tutorial:penguin: Linux教程主要内容Linux 命令、Linux 系统运维、软件运维、精选常用Shell脚本项目地址: https://gitcode.com/GitHub_Trending/lin/linux-tutorial创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考