diff --git "a/53 \347\216\213\351\233\257\351\235\231/20240618\345\221\250\346\234\237\344\273\273\345\212\241\345\222\214\347\216\257\345\242\203\345\217\230\351\207\217.md" "b/53 \347\216\213\351\233\257\351\235\231/20240618\345\221\250\346\234\237\344\273\273\345\212\241\345\222\214\347\216\257\345\242\203\345\217\230\351\207\217.md" new file mode 100644 index 0000000000000000000000000000000000000000..c1699fd28385f38091fe72b8e04c1e16bbc415d8 --- /dev/null +++ "b/53 \347\216\213\351\233\257\351\235\231/20240618\345\221\250\346\234\237\344\273\273\345\212\241\345\222\214\347\216\257\345\242\203\345\217\230\351\207\217.md" @@ -0,0 +1,587 @@ +## 1. 什么是Cron? + +Cron是一种基于时间的任务调度程序,用于在特定时间或时间间隔自动执行任务。它是Unix类操作系统(包括Linux)中的一个守护进程,能够按照用户定义的时间表运行指定的脚本或命令。 + +“Cron” 的读音是 /krɒn/,“Cron”的读音在中文中可以表述为“克隆”(kè ró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任务**: + + crontab -e # edit + + 这将打开用户的Cron配置文件进行编辑。 + +* **查看Cron任务**: + + crontab -l # list + + 这将列出用户当前的Cron任务。 + +* **删除Cron任务**: + + crontab -r # remove + + 这将删除用户的所有Cron任务。 + +**Cron任务语法** + +Cron任务的格式如下: + * * * * * command_to_execute # command_to_execute 可以是命令也可以是包含命令的文件 + - - - - - + | | | | | + | | | | +----- 星期几 (0 - 7) (星期天 = 0 或 7) + | | | +------- 月份 (1 - 12) + | | +--------- 日期 (1 - 31) + | +----------- 小时 (0 - 23) + +------------- 分钟 (0 - 59) + +例如,要每天凌晨3点执行一个备份脚本,可以添加以下条目: + 0 15 * * * /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. **星号(`*`)** + + * **含义**:匹配任何值,,即每一。 + + * **示例**:在分钟字段中使用 `*` 表示每一分钟都运行一次任务。 + + * * * * * /path/to/command + +2. **逗号(`,`)** + + * **含义**:指定一个列表值,列出所有指定值 a,b,c。 + + * **示例**:在小时字段中使用 `0,6,12,18` 表示任务将在每天的0点、6点、12点和18点运行。 + 0 0,6,12,18 * * * /path/to/command + +3. **短横线(`-`)** + + * **含义**:指定一个范围值,开始-结尾。 + + * **示例**:在日期字段中使用 `1-5` 表示任务将在每个月的1号到5号之间运行。 + 0 0 1-5 * * /path/to/command + +4. **斜杠(`/`)** + + * **含义**:指定步长值,即间隔。 + + * **示例**:在分钟字段中使用 `*/15` 表示任务每15分钟运行一次。 + */15 * * * * /path/to/command + +5. **L(Last)** + + * **含义**:表示最后一个。可以在月的天数或星期几中使用。 + + * **示例**:在日期字段中使用 `L` 表示每个月的最后一天。 + 0 0 L * * /path/to/command + + * **示例**:在星期几字段中使用 `5L` 表示每个月的最后一个星期五。 + 0 0 * * 5L /path/to/command + +### 3.5 例子和应用 + +1. **每月的第一个工作日**3 + 0 9 2W * * /path/to/command + +2. **每月的最后一天** + 0 23 1L * * [ "$(date +\%d -d tomorrow)" == "01" ] && /path/to/command + +3. **每个月的最后一个星期五** + 0 23 ? * 5#2 /path/to/command + +4. **每隔10分钟** + 10/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` 示例: + # 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` 示例: + # m h dom mon dow user command + 30 2 * * * root /usr/local/bin/backup.sh + +`/etc/cron.d/cleanup` 示例: + # 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. **设置权限**:确保脚本具有执行权限。可以使用以下命令设置: + chmod +x /etc/cron.daily/your_script.sh + +### 5.3 示例案例 + +1. **每小时运行任务**: + + * **用例**:每小时检查系统资源使用情况并记录到日志文件。 + + * **步骤**: + + 1. 创建脚本 `/etc/cron.hourly/resource_check.sh`: + #!/bin/bash + date >> /var/log/resource_usage.log + top -b -n1 | head -n 20 >> /var/log/resource_usage.log + + 2. 设置脚本权限: + chmod +x /etc/cron.hourly/resource_check.sh + +2. **每日运行任务**: + + * **用例**:每天备份数据库。 + + * **步骤**: + + 1. 创建脚本 `/etc/cron.daily/db_backup.sh`: + #!/bin/bash + mysqldump -u root -pYourPassword your_database > /backup/db_$(date +\%F).sql + + # $(date +%F) 表示的是命令替换(command substitution),而不是简单的变量。 + + # 在Shell中,命令替换的形式是 $(command),它会执行括号内的命令,并用其输出结果替换整个表达式。 + + 2. 设置脚本权限: + chmod +x /etc/cron.daily/db_backup.sh + +3. **每周运行任务**: + + * **用例**:每周清理一次系统缓存。 + + * **步骤**: + + 1. 创建脚本 `/etc/cron.weekly/cache_cleanup.sh`: + #!/bin/bash + apt-get clean + + 2. 设置脚本权限: + chmod +x /etc/cron.weekly/cache_cleanup.sh + +4. **每月运行任务**: + + * **用例**:每月生成并发送系统报告。 + + * **步骤**: + + 1. 创建脚本 `/etc/cron.monthly/system_report.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. 设置脚本权限: + chmod +x /etc/cron.monthly/system_report.sh + +### 5.4 注意事项 + +1. **脚本格式**:确保脚本是可执行的,并且首行包含正确的shebang(例如 `#!/bin/bash`)。 +2. **日志记录**:为调试和审计目的,可以在脚本中添加日志记录功能,以便了解脚本的执行情况。 +3. **测试脚本**:在将脚本放入周期性任务目录之前,最好手动测试脚本,以确保其在预期环境下正常工作。 + +通过将脚本放置到相应的周期性任务目录中,可以轻松实现定期自动化任务的管理,无需手动编辑cron表。这样不仅简化了管理任务的复杂性,还提高了系统的自动化和可靠性。 + +## 环境变量 + +理解和使用Linux环境变量对于管理和配置系统至关重要。以下是关键的知识点、常用场景以及示例的综合整理: + +### 1. 环境变量的类型和作用 + +* **用户级别环境变量**: + + * 存储在用户家目录的个人配置文件中,例如 `~/.bashrc`、`~/.profile`。 + * 用于定义**用户个性化**的Shell设置,如别名、路径等。针对不同用户独立设置 + +* **系统级别环境变量**: + + * 存储在系统范围的配置文件中,如 `/etc/environment`、`/etc/profile` 。/etc/profile.d目录 + * 为**所有用户和系统服务**提供全局的环境设置。java_home、python + +### 2. 环境变量的加载顺序和文件 + +* **系统启动加载**:/etc/environment ,一开源就加载,初始化 + +* **登录Shell加载顺序**: + + * 首先加载 `/etc/profile`,然后根据用户登录方式加载 `~/.profile`(存在性依次加载)。 + * 非登录shell: su 切换用户 等 source + +* **交互式Shell加载顺序**: + + * 加载 `~/.bashrc` 或类似文件,用于设置用户个性化的Shell环境。 + * 不同的shell加载不同的文件,bash才加载.bashrc,zsh加载.zshrc + * 交互式:提供命令行窗口,非交互式:直接写在脚本里 + +* **总结来说** + + * 配置文件的理论加载顺序通常是 `/etc/environment` > `/etc/profile` > `~/.profile` > `~/.bashrc`。【实验】 + +### 3. 设置环境变量的方法 + +​ 设置变量的位置:命令行(临时),脚本文件(永久) + +#### 3.1 临时设置环境变量:临时变量(局部),临时环境变量(全部) + +​ 可以使用 `export` 命令来临时设置一个环境变量,例如: + export MY_VAR="value" # export 变量名=值 环境变量是全局的,整个环境有效 + MY_VAR="value" # 少了export 就是临时变量,不是全局的 + +​ 这种设置只在当前Shell会话中有效,关闭Shell会话后会失效。 + +#### 3.2 永久设置环境变量: + +​ **用户级别的** : 编辑用户的 `~/.bashrc` 或 `~/.profile` 文件,并添加如下行: + export MY_VAR="value" + +​ 保存文件后,新的设置会在下次登录时生效。 + +​ **系统级别的:** 编辑 `/etc/environment` 或 /etc/profile文件,并添加类似以下行: + MY_VAR="value" + +这里不需要使用 `export` 命令。保存文件后,变量会在系统启动时生效。 + +#### 3.3 环境变量的设置和使用示例 + +3.1 设置路径变量(PATH) + # 在 ~/.bashrc 中添加 + export PATH=$PATH:/path/to/your/scripts + +3.2 定义Java环境变量(JAVA_HOME) + # 在 ~/.bashrc 或 /etc/environment 中添加 + export JAVA_HOME=/usr/lib/jvm/java-11-openjdk-amd64 + export PATH=$JAVA_HOME/bin:$PATH + +3.3 设置代理服务器(HTTP_PROXY、HTTPS_PROXY) + # 在 ~/.bashrc 中添加 + export HTTP_PROXY=http://proxy.example.com:8080 + export HTTPS_PROXY=http://proxy.example.com:8080 + +3.4 配置编辑器(EDITOR) + # 在 ~/.bashrc 中添加 + export EDITOR=/usr/bin/vim + +3.5 设置语言和地区(LANG、LC_系列变量) + # 在 ~/.bashrc 或 /etc/environment 中添加 + export LANG=en_US.UTF-8 + export LC_ALL=en_US.UTF-8 + +3.6 自定义命令别名(alias) + # 在 ~/.bashrc 中添加 + alias ll='ls -alF' + alias grep='grep --color=auto' + +3.7 设置临时环境变量 + # 临时设置变量 + export MY_VAR="value" + +### 4. 常用环境变量 + +打印所有环境变量: + printenv + #或 + env + +**系统级** + +* `PATH` 可执行文件的搜索路径 +* `LANG` 定义系统的语言环境和字符集, export LANG=zh_CN.utf8,编辑文件不乱码 +* `LANGUAGE` 用于设置消息语言的优先级 ,提示语言为中文 +* `EDITOR` 默认文本编辑器 editor + +**用户级** + +* **`HOME`** :当前用户的主目录。 +* **`USER`**:当前用户名。 +* **`UID`**:当前用户的用户ID。 +* **`SHELL`**:当前用户的默认Shell。 + +### 5. 临时变量与环境变量 + +定义一个变量时,在变量名前加了export关键字,就是环境变量,作用域是全局环境子子进程中也有效,否则就是临时变量,只在当前脚本文件或shell中有效。 + +命令行示例: + MY_NAME="张三" # 临时变量(局部) + echo $MY_NAME + bash -c 'echo $MY_NAME' + # 什么结果?对比下面的效果 + + export MY_NAME="张三" # 临时变量(全局) + echo $MY_NAME + bash -c 'echo $MY_NAME' # 子进程 + # 看下效果 + +脚本文件示例 : + +`test1.sh` + #!/bin/bash + MY_NAME="张三" # 前面加上export再试一次 + echo "test:我的名字是:$MY_NAME" + ./subscript.sh + +`test2.sh`: + #!/bin/bash + echo "test2:你的名字是: $MY_NAME" + +**临时变量**:在脚本中定义但不导出的变量仅在脚本执行期间有效,不会影响其他 shell 会话或子进程。 + +**环境变量**:使用 `export` 导出的变量在当前 shell 会话和所有子进程中都有效。 + +### 6. 总结: + +### 4.1 分类 + +#### 按生命周期分 + +* 永久环境变量 写在指定类型的配置文件,永不失效 ~/.bashrc /etc/profile.d/xxx.sh +* 临时环境变量 临时使用export 命令设置的环境变量 退出终端即失效 + +#### 按作用域分 + +* 系统级环境变量 对所有用户生效 /etc/profile.d/xxx.sh +* 用户级环境变量 只对当前用户生效 ~/.bashrc + +### 周期任务练习 + +执行在家目录touch a.txt + +1. 每天3:00执行一次 + 0 3 * * * + +2. 每周六2:00执行 + + 0 2 * * 6 + +3. 每周六1:05执行 + + 5 1 * * 6 + +4. 每周六1:25执行 + + 25 1 * * 6 + +5. 每天8:40执行 + + 40 8 * * * + +6. 每天3:50执行 + + 50 3 * * * + +7. 每周一到周五的3:40执行 + 40 3 * * 1-5 + +8. 每周一到周五的3:41开始,每10分钟执行一次 + 41/10 3 * * 1-5 + +9. 每天的10:31开始,每2小时执行一次 + + 31 10/2 * * * + +10. 每周一到周三的9:30执行一次 + 30 9 * * 1-3 + +11. 每周一到周五的8:00,每周一到周五的9:00执行一次 + 0 8,9 * * 1-5 + +12. 每天的23:45分执行一次 + + 45 23 * * * + +13. 每周三的23:45分执行一次 + + 45 23 * * 3 + +14. 每周一到周五的9:25到11:35、13:00到15:00之间,每隔10分钟执行一次 + + 25-35/10 9-11 * 1-5 */10 13-15 * * 1-5 + +15. 每周一到周五的8:30、8:50、9:30、10:00、10:30、11:00、11:30、13:30、14:00、14:30、5:00分别执行一次 + 30 8-11,13,14 * * 1-5 50 8 * * 1-5 0 10,11,14 * * 1-5 + +16. 每天16:00、10:00执行一次 + 0 10,16 * * * + +17. 每天8:10、16:00、21:00分别执行一 + 10 8 * * * 0 16,21 * * * + +18. 每天7:47、8:00分别执行一次 + 47 7 * * * 0 8 * * * + +### 练习题 1: 显示当前所有的环境变量 + +* 使用`printenv`或`env`命令来显示所有的环境变量。 + root@hecs-336440:/home/618# printenv + root@hecs-336440:/home/618# env + +### 练习题 2: 显示`HOME`环境变量的值 + +* 使用`echo`命令和`$`符号来显示`HOME`环境变量的值。 + root@hecs-336440:/home/618# echo $HOME + +### 练习题 3: 临时设置一个新的环境变量 + +* 设置一个名为`MY_AGE`的环境变量,并将其值设置为`18`。 + root@hecs-336440:/home/618# export MY_AGE=18 + +### 练习题 4: 显示新设置的环境变量 + +* 使用`echo`命令来显示`MY_AGE`的值。 + echo $MY_VARIABLE + +### 练习题 5: 在新的shell会话中检查环境变量 + +* 打开一个新的终端窗口或标签页,并尝试显示`MY_AGE`的值。你会看到什么?为什么? + +### 练习题 6: 修改`PATH`环境变量 + +* 将`你当前用户的家目录`添加到你的`PATH`环境变量的末尾位置 + root@hecs-336440:/home/618# export PATH=$PATH:/home + +将`/tmp`添加到你的`PATH`环境变量的开始位置,(注意:这可能会覆盖其他路径中的同名命令,所以请谨慎操作)。 + root@hecs-336440:/home/618# export PATH=/tmp:$PATH + +### 练习题 7: 验证`PATH`的修改 + +* 使用`echo`命令显示`PATH`的值,并确认`前面添加的目录`已经被添加到对应位置。 + root@hecs-336440:/home/618# echo $PATH + +### 练习题 8: 永久设置环境变量 + +* 在你的shell配置文件中(如`~/.bashrc`、`~/.bash_profile`、`~/.zshrc`等,取决于你使用的shell和配置)添加一行来永久设置`MY_NAME`,值设置为`奥德彪`。 + +例如,对于bash shell,你可以使用: + root@hecs-336440:/home/618# echo 'export MY_NAME="奥德彪"' >> ~/.bashrc + +如何让`MY_NAME`生效,并验证 + root@hecs-336440:/home/618# source ~/.bashrc + root@hecs-336440:/home/618# echo $MY_NAME + +### 练习题 9: 清理 + +* 清除你之前设置的`MY_AGE`和`PATH`的修改(如果你不想永久保留它们)。 + root@hecs-336440:/home/618# unset MY_AGE + root@hecs-336440:/home/618# unset PATH + +### 练习题 10: 修改默认器 + +* 使用`EDITOR`变量,修改你默认的编辑器为nano。 + root@hecs-336440:/home/618# export EDITOR = nano + +### 练习题 11: 修改语言 + +* 使用`LANG`变量,让你的文件支持中文和utf8编码来避免乱码。 + root@hecs-336440:/home/618# export LANG=zh_CN.UTF-8 + +* 使用`LANGUAGE`变量,让你的命令提示为中文 + root@hecs-336440:/home/618# export LANGUAGE=zh_CN.utf8