diff --git "a/\346\235\216\350\210\222\346\261\266/20240617\345\221\250\346\234\237\344\273\273\345\212\241\347\256\241\347\220\206.md" "b/\346\235\216\350\210\222\346\261\266/20240617\345\221\250\346\234\237\344\273\273\345\212\241\347\256\241\347\220\206.md" new file mode 100644 index 0000000000000000000000000000000000000000..f4a3a4b52d7bef9447cd75df6bee4f5ccfaaf9f2 --- /dev/null +++ "b/\346\235\216\350\210\222\346\261\266/20240617\345\221\250\346\234\237\344\273\273\345\212\241\347\256\241\347\220\206.md" @@ -0,0 +1,553 @@ +## 周期任务练习 + +执行在家目录touch a.txt + +1. 每天3:00执行一次 + + ```bash + 0 3 * * * /home/hrh/a.txt + ``` + + + +2. 每周六2:00执行 + + ```bash + 0 2 * * 6 /home/hrh/a.txt + ``` + + + +3. 每周六1:05执行 + + ```bash + 05 01 * * 6 /home/hrh/a.txt + ``` + + + +4. 每周六1:25执行 + + ```bash + 25 01 * * 6 /home/hrh/a.txt + ``` + + + +5. 每天8:40执行 + + ```bash + 40 8 * * * /home/hrh/a.txt + ``` + + + +6. 每天3:50执行 + + ```bash + 50 3 * * * /home/hrh/a.txt + ``` + + + +7. 每周一到周五的3:40执行 + + ```bash + 40 3 * * 1-5 /home/hrh/a.txt + ``` + + + +8. 每周一到周五的3:41开始,每10分钟执行一次 + + ```bash + 41-59/10 3 * * 1-5 /home/hrh/a.txt + ``` + + + +9. 每天的10:31开始,每2小时执行一次 + + ```bash + 31 10/2 * * * /home/hrh/a.txt + ``` + + + +10. 每周一到周三的9:30执行一次 + + ```bash + 30 9 * * 1-3 /home/hrh/a.txt + ``` + + + +11. 每周一到周五的8:00,每周一到周五的9:00执行一次 + + ```bash + 0 8 * * 1-5 /home/hrh/a.txt + 0 9 * * 1-5 /home/hrh/a.txt + ``` + + + +12. 每天的23:45分执行一次 + + ```bash + 45 23 * * * /home/hrh/a.txt + ``` + + + +13. 每周三的23:45分执行一次 + + ```bash + 45 23 * * 3 /home/hrh/a.txt + ``` + + + +14. 每周一到周五的9:25到11:35、13:00到15:00之间,每隔10分钟执行一次 + + ```bash + 25,35,45,55 9 * * 1-5 /home/hrh/a.txt + 5-59/10 10 * * 1-5 /home/hrh/a.txt + 5,15,25,35 11 * * 1-5 /home/hrh/a.txt + */10 13-15 * * 1-5 /home/hrh/a.txt + ``` + + + +15. 每周一到周五的8:30、8:50、9:30、10:00、10:30、11:00、11:30、13:30、14:00、14:30、5:00分别执行一次 + + ```bash + 30,50 8 * * 1-5 /home/hrh/a.txt + 30 9 * * 1-5 /home/hrh/a.txt + */30 10-11 * * 1-5 /home/hrh/a.txt + 30 13 * * 1-5 /home/hrh/a.txt + 30 14 * * 1-5 /home/hrh/a.txt + 0 5 * * 1-5 /home/hrh/a.txt + ``` + + + +16. 每天16:00、10:00执行一次 + + ```bash + 0 16,10 * * * /home/hrh/a.txt + ``` + + + +17. 每天8:10、16:00、21:00分别执行一次 + + ```bash + 10 8 * * * /home/hrh/a.txt + 0 16 * * * /home/hrh/a.txt + 0 21 * * * /home/hrh/a.txt + ``` + + + +18. 每天7:47、8:00分别执行一次 + + ```bash + 47 7 * * * /home/hrh/a.txt + 0 8 * * * /home/hrh/a.txt + ``` + + + + + + +好的,我们来聊一聊Linux系统中关于Debian的周期任务管理。周期任务管理主要涉及计划任务的创建和管理,通常使用`cron`工具。 + +## 1. 什么是Cron? + +Cron是一种基于时间的任务调度程序,用于在特定时间或时间间隔自动执行任务。它是Unix类操作系统(包括Linux)中的一个守护进程,能够按照用户定义的时间表运行指定的脚本或命令。 + +“Cron” 的读音是 /krɒn/,“Cron”的读音在中文中可以表述为“克隆”(kè lóng)。 + +## 2. Cron的配置文件 + +在Debian系统中,Cron任务的配置文件通常分为以下几类: + +1. **用户级Cron任务**:每个用户都有自己的Cron任务配置文件,位于`/var/spool/cron/crontabs/username`。 +2. **系统级Cron任务**:系统级的Cron任务配置文件位于`/etc/crontab`和`/etc/cron.d/`目录下。 +3. **周期性任务目录**:这些目录包含在特定时间间隔运行的脚本,例如: + - `/etc/cron.hourly/` + - `/etc/cron.daily/` + - `/etc/cron.weekly/` + - `/etc/cron.monthly/` + +## 3. 编辑Cron任务 + +### 3.1 使用`crontab`命令 + +用户可以使用`crontab`命令来编辑、查看或删除自己的Cron任务【用户级】。 + +cron table 时间周期表,计划任务表 + +- **编辑Cron任务**: + + ```sh + crontab -e # edit + ``` + + 这将打开用户的Cron配置文件进行编辑。 + +- **查看Cron任务**: + + ```sh + crontab -l # list + ``` + + 这将列出用户当前的Cron任务。 + +- **删除Cron任务**: + + ```sh + crontab -r # remove + ``` + + 这将删除用户的所有Cron任务。 + +**Cron任务语法** + +Cron任务的格式如下: + +```sh +* * * * * command_to_execute # command_to_execute 可以是命令也可以是包含命令的文件 +- - - - - +| | | | | +| | | | +----- 星期几 (0 - 7) (星期天 = 0 或 7) +| | | +------- 月份 (1 - 12) +| | +--------- 日期 (1 - 31) +| +----------- 小时 (0 - 23) ++------------- 分钟 (0 - 59) +``` + +例如,要每天凌晨3点执行一个备份脚本,可以添加以下条目: + +```sh +0 3 * * * /path/to/backup_script.sh +``` + +[点击查看:cron表达式详细介绍以及常用的例子](https://developer.aliyun.com/article/1349827) + +### 3.2 使用`/etc/crontab` + +系统级的Cron任务可以直接编辑`/etc/crontab`文件。该文件具有一个额外的字段用于指定运行任务的用户: + +``` +# m h dom mon dow user command +17 * * * * root cd / && run-parts --report /etc/cron.hourly +25 6 * * 1 root test -x /usr/sbin/anacron || ( cd / && run-parts --report /etc/cron.weekly ) +47 6 1 * * root test -x /usr/sbin/anacron || ( cd / && run-parts --report /etc/cron.monthly ) +``` + +### 3.3 使用`/etc/cron.d/` + +在`/etc/cron.d/`目录下,可以创建单独的文件来定义Cron任务。每个文件的格式与`/etc/crontab`类似。 + +例如,可以在`/etc/cron.d/mytasks`中定义: + +``` +30 2 * * * root /usr/local/bin/my_script.sh +``` + + + +### 3.4 特殊符号 + +**常用的如下:** + +1. **星号(`*`)** + + - **含义**:匹配任何值,,即每一。 + - **示例**:在分钟字段中使用 `*` 表示每一分钟都运行一次任务。 + + ```sh + * * * * * /path/to/command + ``` + +2. **逗号(`,`)** + + - **含义**:指定一个列表值,列出所有指定值 a,b,c。 + - **示例**:在小时字段中使用 `0,6,12,18` 表示任务将在每天的0点、6点、12点和18点运行。 + + ```sh + 0 0,6,12,18 * * * /path/to/command + ``` + +3. **短横线(`-`)** + + - **含义**:指定一个范围值,开始-结尾。 + - **示例**:在日期字段中使用 `1-5` 表示任务将在每个月的1号到5号之间运行。 + + ```sh + 0 0 1-5 * * /path/to/command + ``` + +4. **斜杠(`/`)** + + - **含义**:指定步长值,即间隔。 + - **示例**:在分钟字段中使用 `*/15` 表示任务每15分钟运行一次。 + + ```sh + */15 * * * * /path/to/command + ``` + +5. **L(Last)** + + - **含义**:表示最后一个。可以在月的天数或星期几中使用。 + - **示例**:在日期字段中使用 `L` 表示每个月的最后一天。 + + ```sh + 0 0 L * * /path/to/command + ``` + + - **示例**:在星期几字段中使用 `5L` 表示每个月的最后一个星期五。 + + ```sh + 0 0 * * 5L /path/to/command + ``` + +### 3.5 例子和应用 + +1. **每月的第一个工作日** + + ```sh + 0 9 1W * * /path/to/command + ``` + +2. **每月的最后一天** + + ```sh + 0 23 28-31 * * [ "$(date +\%d -d tomorrow)" == "01" ] && /path/to/command + ``` + +3. **每个月的最后一个星期五** + + ```sh + 0 23 * * 5L /path/to/command + ``` + +4. **每隔10分钟** + + ```sh + */10 * * * * /path/to/command + ``` + +通过使用这些特殊符号,可以灵活地定义各种复杂的时间调度任务,使得cron更加强大和易用。 + + + +### 3.6 注意事项 + +1. **路径问题**:Cron任务运行时使用的环境变量可能与用户的交互式Shell不同,确保在脚本中使用绝对路径。 +2. **权限问题**:确保脚本具有可执行权限,并且Cron任务的用户有权限执行该脚本。 + +## 4. 系统级任务 + +### **4.1 crontab 和 cron.d** + +在Debian和其他基于Unix的操作系统中,`/etc/crontab` 和 `/etc/cron.d/` 目录用于管理系统级的计划任务。虽然它们的功能类似,但在使用场景和配置格式上有一些细微的区别。以下是它们的详细介绍和使用场景: + +#### **4.1.1** **`/etc/crontab`** + +**特点:** + +1. **全局配置文件**:`/etc/crontab` 是一个全局配置文件,用于定义系统级的定时任务。 + +2. **文件格式**:与用户级的 `crontab` 文件相比,`/etc/crontab` 多了一个字段,用于指定执行任务的用户。格式如下: + + ``` + m h dom mon dow user command + ``` + + 例如: + + ``` + 30 2 * * * root /usr/local/bin/backup.sh + ``` + + 这行表示每天凌晨2:30以root用户的身份执行 `/usr/local/bin/backup.sh`。 + +**使用场景:** + +- **统一管理系统任务**:适合定义一些系统级的任务,比如系统备份、日志轮替等。 +- **需要不同用户执行的任务**:如果需要在同一文件中定义由不同用户执行的任务,可以使用 `/etc/crontab`。 + +#### **4.1.2** **`/etc/cron.d/`** + +**特点:** + +1. **目录结构**:`/etc/cron.d/` 目录中可以包含多个文件,每个文件可以定义多个任务。 + +2. **文件格式**:与 `/etc/crontab` 文件的格式相同,需要包含一个用户字段。格式如下: + + ``` + m h dom mon dow user command + ``` + + 例如,在 `/etc/cron.d/mytasks` 文件中: + + ``` + 0 4 * * * root /usr/local/bin/daily_task.sh + 15 14 1 * * user /usr/local/bin/monthly_report.sh + ``` + +**使用场景:** + +- **模块化管理**:适合将不同的任务分模块管理,每个模块一个文件。例如,可以为不同的应用程序或服务创建单独的文件。 +- **包管理系统的任务**:一些软件包在安装时会自动在 `/etc/cron.d/` 中创建任务文件,这是包管理系统用来添加特定任务的常见方法。 + +#### **4..13 选择使用场景** + +1. **统一和简洁管理**: + - 如果你希望在一个文件中集中管理所有系统级的Cron任务,可以使用 `/etc/crontab`。 + - 适合于系统管理员需要定期检查和修改所有任务的场景。 + +2. **分离和模块化管理**: + - 如果你希望将Cron任务按模块或应用分开管理,使用 `/etc/cron.d/` 是更好的选择。 + - 适合于不同团队或不同软件包管理各自的定时任务,避免相互干扰。 + +#### **4.1.4 示例对比** + +`/etc/crontab` 示例: + +```sh +# m h dom mon dow user command +30 2 * * * root /usr/local/bin/backup.sh +45 3 * * 7 user /usr/local/bin/cleanup.sh +``` + +`/etc/cron.d/backup` 示例: + +```sh +# m h dom mon dow user command +30 2 * * * root /usr/local/bin/backup.sh +``` + +`/etc/cron.d/cleanup` 示例: + +```sh +# m h dom mon dow user command +45 3 * * 7 user /usr/local/bin/cleanup.sh +``` + +通过这种方式,使用 `/etc/cron.d/` 可以更加灵活地管理和组织不同的任务。 + + + +## 5. 周期性任务目录 + +### 5.1 目录说明 + +1. **`/etc/cron.hourly/`**:每小时运行一次目录中的所有脚本。 +2. **`/etc/cron.daily/`**:每天运行一次目录中的所有脚本。 +3. **`/etc/cron.weekly/`**:每周运行一次目录中的所有脚本。 +4. **`/etc/cron.monthly/`**:每月运行一次目录中的所有脚本。 + +### 5.2 **使用方法** + +1. **创建脚本**:将要定期运行的脚本放置到相应的目录中。 + +2. **设置权限**:确保脚本具有执行权限。可以使用以下命令设置: + + ```sh + chmod +x /etc/cron.daily/your_script.sh + ``` + +### 5.3 示例案例 + +1. **每小时运行任务**: + + - **用例**:每小时检查系统资源使用情况并记录到日志文件。 + + - **步骤**: + + 1. 创建脚本 `/etc/cron.hourly/resource_check.sh`: + + ```sh + #!/bin/bash + date >> /var/log/resource_usage.log + top -b -n1 | head -n 20 >> /var/log/resource_usage.log + ``` + + 2. 设置脚本权限: + + ```sh + chmod +x /etc/cron.hourly/resource_check.sh + ``` + +2. **每日运行任务**: + + - **用例**:每天备份数据库。 + + - **步骤**: + + 1. 创建脚本 `/etc/cron.daily/db_backup.sh`: + + ```sh + #!/bin/bash + mysqldump -u root -pYourPassword your_database > /backup/db_$(date +\%F).sql + # $(date +%F) 表示的是命令替换(command substitution),而不是简单的变量。 + # 在Shell中,命令替换的形式是 $(command),它会执行括号内的命令,并用其输出结果替换整个表达式。 + ``` + + 2. 设置脚本权限: + + ```sh + chmod +x /etc/cron.daily/db_backup.sh + ``` + +3. **每周运行任务**: + + - **用例**:每周清理一次系统缓存。 + + - **步骤**: + + 1. 创建脚本 `/etc/cron.weekly/cache_cleanup.sh`: + + ```sh + #!/bin/bash + apt-get clean + ``` + + 2. 设置脚本权限: + + ```sh + chmod +x /etc/cron.weekly/cache_cleanup.sh + ``` + +4. **每月运行任务**: + + - **用例**:每月生成并发送系统报告。 + + - **步骤**: + + 1. 创建脚本 `/etc/cron.monthly/system_report.sh`: + + ```sh + #!/bin/bash + report_date=$(date +\%Y-\%m-\%d) + df -h > /var/reports/system_report_$report_date.txt + mail -s "Monthly System Report" admin@example.com < /var/reports/system_report_$report_date.txt + ``` + + 2. 设置脚本权限: + + ```sh + chmod +x /etc/cron.monthly/system_report.sh + ``` + +### 5.4 注意事项 + +1. **脚本格式**:确保脚本是可执行的,并且首行包含正确的shebang(例如 `#!/bin/bash`)。 +2. **日志记录**:为调试和审计目的,可以在脚本中添加日志记录功能,以便了解脚本的执行情况。 +3. **测试脚本**:在将脚本放入周期性任务目录之前,最好手动测试脚本,以确保其在预期环境下正常工作。 + +通过将脚本放置到相应的周期性任务目录中,可以轻松实现定期自动化任务的管理,无需手动编辑cron表。这样不仅简化了管理任务的复杂性,还提高了系统的自动化和可靠性。 \ No newline at end of file