Linux通过Crontab实现自启动
文章目录
- 前言
- 一、Crontab实现重启流程
- 1.配置阶段
- 1.1.任务定义
- 1.2.特殊符号说明
- 1.3.正则简介
- 1.3.1.基本元字符
- 1.3.2.量词(重复匹配)
- 1.3.3.位置锚点
- 1.3.4.分组与捕获
- 1.3.5.零宽断言(高级匹配)
- 1.3.6.常见用例
- ① 邮箱验证
- ② URL 提取
- ③ 日期匹配(YYYY-MM-DD)
- ④ 手机号(中国大陆)
- 1.3.7.正则表达式修饰符
- 1.4.正式配置
- 1.5.任务执行流程
- 时间匹配
- 环境加载
- 任务执行
- 二、Crontab命令详解
- 2.1.基本命令
- 2.2.查看 cron 日志(调试)
- 2.2.1.系统日志(检查 cron 是否执行):
- 2.2.2.如果任务未执行,检查服务是否运行:
- 2.3.Cron 时间格式
- 2.3.1.五个时间字段的含义(从左到右):
- 2.3.2.特殊符号:
- 2.4.示例
- 2.5.注意事项
- 2.6.备份与恢复
- 2.6.1.备份
- 2.6.2.恢复
前言
本文主要记录通过crontab实现当服务器宕机或服务意外停止时进行自动重启
一、Crontab实现重启流程
1.配置阶段
1.1.任务定义
用户通过crontab -e编辑任务文件,按分钟 小时 日 月 周 命令格式编写规则(如
*/1 * * * * /opt/script.sh
表示每1分钟执行一次脚本)
1.2.特殊符号说明
* :匹配所有值
,:多值分隔(如1,3,5表示1、3、5分钟)
-:范围(如0-6表示0到6点)
/:间隔(如*/10表示每10分钟)
1.3.正则简介
1.3.1.基本元字符
元字符 | 说明 | 示例 |
---|---|---|
. 匹配任意单个字符(除换行符 \n) | a.c → abc, a@c | |
\d | 匹配数字(等价于 [0-9]) | \d\d → 42 |
\D | 匹配非数字(等价于 [^0-9]) | \D+ → abc |
\w | 匹配单词字符(字母、数字、下划线) | \w+ → user_1 |
\W | 匹配非单词字符(如 !, @) | \W → ! |
\s | 匹配空白字符(空格、制表符 \t、换行符 \n 等) | a\sb → a b |
\S | 匹配非空白字符 | \S+ → Hello |
[…] | 匹配括号内的任意一个字符 | [aeiou] → a, e |
[^…] | 匹配不在括号内的任意字符 | [^0-9] → a, ! |
1.3.2.量词(重复匹配)
量词 | 说明 | 示例 |
---|---|---|
* | 匹配前一个字符 0 次或多次 | a*b → b, aaab |
+ | 匹配前一个字符 1 次或多次 | a+b → ab, aaab |
? | 匹配前一个字符 0 次或 1 次 | a?b → b, ab |
{n} | 匹配前一个字符 恰好 n 次 | a{3} → aaa |
{n,} | 匹配前一个字符 至少 n 次 | a{2,} → aa, aaa |
{n,m} | 匹配前一个字符 n 到 m 次 | a{2,4} → aa, aaa |
1.3.3.位置锚点
锚点 | 说明 | 示例 |
---|---|---|
^ | 匹配字符串的开始 | ^Hello → Hello world 中的 Hello |
$ | 匹配字符串的结束 | world$ → Hello world 中的 world |
\b | 匹配单词边界 | \bcat\b → cat(不匹配 category) |
\B | 匹配非单词边界 | \Bcat\B → category 中的 cat |
1.3.4.分组与捕获
语法 | 说明 | 示例 |
---|---|---|
(…) | 捕获分组,提取匹配内容 | (ab)+ → abab(捕获 ab) |
(?:…) | 非捕获分组,仅分组不捕获 | (?:ab)+ → abab(不捕获) |
| | 或逻辑,匹配左侧或右侧 | cat |
\1, \2 | 反向引用,引用捕获的分组 | (\d)\1 → 11, 22 |
1.3.5.零宽断言(高级匹配)
断言 | 说明 | 示例 |
---|---|---|
(?=…) | 正向先行断言,匹配后面是 … 的位置 | \d+(?=px) → 2(在 2px 中) |
(?!..) | 负向先行断言,匹配后面不是 … 的位置 | \d+(?!px) → 3(在 3em 中) |
(?<=…) | 正向后行断言,匹配前面是 … 的位置 | (?<=$)\d+ → 100(在 $100 中) |
(?<!..) | 负向后行断言,匹配前面不是 … 的位置 | (?<!$)\d+ → 50(在 €50 中) |
1.3.6.常见用例
① 邮箱验证
^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}$
匹配:user@example.com
不匹配:user@.com
② URL 提取
https?://[^\s/$.?#].[^\s]*
匹配:https://example.com/path
③ 日期匹配(YYYY-MM-DD)
^\d{4}-(0[1-9]|1[0-2])-(0[1-9]|[12][0-9]|3[01])$
匹配:2023-12-31
不匹配:2023-13-40
④ 手机号(中国大陆)
^1[3-9]\d{9}$
匹配:13812345678
1.3.7.正则表达式修饰符
修饰符 | 说明 | 示例 |
---|---|---|
i | 忽略大小写 | /hello/i → Hello |
g | 全局匹配(匹配所有结果) | /a/g → a a a 中的 3 个 a |
m | 多行模式(^ 和 $ 匹配每行的开头/结尾) | /^a/m → 匹配多行中的 a |
1.4.正式配置
步骤一:
执行
crontab -e
命令
步骤二:
点击字母“i” 输入下方指令:
方案一:监听端口 每隔X时间去判断是否启动状态:
*/1 * * * * source /etc/profile && ss -ntpl |grep 8080 |grep -v grep || sh /启动脚本完整路径/启动脚本.sh 后面跟启动脚本的完整启动命令
输入后 点击“esc” 点击后点击“ crtl + : ”, 输入wq保存退出。
方案二:每天定时重启(晚上10点):
0 22 * * * source /etc/profile && cd /启动脚本完整路径 && sh /启动脚本完整路径/脚本.sh restart 后面跟启动脚本的完整启动命令
配置完成保存后可通过crontab -l
命令验证
1.5.任务执行流程
时间匹配
crond每分钟遍历所有任务,对比当前时间与任务的时间表达式
环境加载
执行时继承系统环境变量(如PATH),建议脚本内显式加载/etc/profile或~/.bash_profile
任务执行
执行对应监听任务
二、Crontab命令详解
2.1.基本命令
命令 | 说明 |
---|---|
crontab -e | 编辑当前用户的 cron 任务表(使用默认编辑器,如 vim 或 nano) |
crontab -l | 列出当前用户的所有 cron 任务 |
crontab -r | 删除当前用户的所有 cron 任务(谨慎使用,无确认!) |
crontab -u <用户名> -e | 编辑指定用户的 cron 任务(需 root 权限) |
crontab -u <用户名> -l | 列出指定用户的 cron 任务 |
crontab -u <用户名> -r | 删除指定用户的所有 cron 任务 |
2.2.查看 cron 日志(调试)
2.2.1.系统日志(检查 cron 是否执行):
grep CRON /var/log/syslog # Ubuntu/Debian
grep CRON /var/log/cron # CentOS/RHEL
2.2.2.如果任务未执行,检查服务是否运行:
systemctl status cron # Ubuntu/Debian
systemctl status crond # CentOS/RHEL
2.3.Cron 时间格式
编辑 crontab -e 时,每行任务格式如下:
* * * * * <要执行的命令>
2.3.1.五个时间字段的含义(从左到右):
分钟(0-59)
小时(0-23)
日期(1-31)
月份(1-12)
星期(0-7,0 和 7 均代表周日)
2.3.2.特殊符号:
*:任意值(每分钟/每小时等)
,:分隔多个时间(如 1,15 * * * * 表示每小时的 1 分和 15 分)
-:范围(如 10-20 * * * * 表示每小时的 10 到 20 分)
*/n:每隔 n 单位(如 */5 * * * * 表示每 5 分钟)
2.4.示例
1.每天凌晨 3 点执行脚本
0 3 * * * /path/to/script.sh
2.每 5 分钟执行一次
*/5 * * * * /path/to/command
3.每周一和周五的下午 5:30 发送邮件
30 17 * * 1,5 /usr/bin/sendmail -t < /tmp/email.txt
4.每月 1 号的凌晨 1 点重启服务
0 1 1 * * systemctl restart nginx
2.5.注意事项
1.环境变量问题:cron 默认使用最小环境变量,建议在脚本中使用绝对路径或提前设置 PATH。
2.输出处理:cron 任务的输出会以邮件发送给用户,如需忽略输出:
* * * * * /path/to/command >/dev/null 2>&1
3.权限限制:普通用户只能编辑自己的 cron 任务,root 可管理其他用户的任务。
2.6.备份与恢复
2.6.1.备份
crontab -l > ~/cron_backup.txt
2.6.2.恢复
crontab ~/cron_backup.txt