一、定时自动备份:用 crontab+tar 实现 “无人值守备份”
之前学了tar
手动备份和crontab
定时任务,今天把它们结合起来 —— 让系统每天凌晨 3 点自动备份你的linux_study
目录,不用你手动操作(再也不怕忘备份)。
1. 先明确需求:每天凌晨 3 点,备份~/linux_study
到/backup
,文件名带日期
为什么要自动备份? 就像手机 “自动云备份”,你不用管,系统到点就执行,哪怕你忘了,数据也安全。
2. 实操 1:写一个 “备份脚本”(把备份命令放进脚本,方便定时调用)
步骤 1:在linux_study
目录创建备份脚本auto_backup.sh
:
bash
cd ~/linux_study
nano auto_backup.sh # 打开编辑器
步骤 2:写入以下内容(复制粘贴,注意替换成你的用户名):
bash
#!/bin/bash
# 自动备份脚本:每天备份linux_study到/backup
# 定义备份源目录(你的学习目录)
source_dir="~/linux_study"
# 定义备份目标目录(之前创建的/backup)
backup_dir="/backup"
# 定义备份文件名(带日期和时间,精确到分钟,避免重名)
backup_filename="linux_study-backup-$(date +%Y%m%d_%H%M).tar.gz"
# 执行备份(用tar打包压缩)
# 注意:如果/backup目录需要管理员权限,命令前加sudo
sudo tar -zcvf "${backup_dir}/${backup_filename}" "$source_dir"
# 备份完成后提示(可选,会记录到日志)
echo "[$(date)] 备份完成:${backup_dir}/${backup_filename}" >> ~/linux_study/backup_log.txt
步骤 3:给脚本加执行权限(必须,否则 crontab 无法运行):
bash
chmod +x auto_backup.sh
步骤 4:手动测试脚本是否能正常运行(先确保手动能跑通,再设定时):
bash
./auto_backup.sh # 执行脚本
- 输入你的用户密码(因为有
sudo
); - 执行完后,用
ls /backup
查看,应该有一个带日期的.tar.gz
备份文件; - 用
cat ~/linux_study/backup_log.txt
查看,会有备份成功的记录。
3. 实操 2:用 crontab 设置 “每天凌晨 3 点执行脚本”
步骤 1:打开当前用户的定时任务编辑器:
bash
crontab -e
- 首次打开会让你选编辑器,选
nano
(输入数字 2,回车)。
步骤 2:在文件末尾添加一行(定时规则 + 脚本路径):
bash
# 每天凌晨3点执行auto_backup.sh脚本
0 3 * * * ~/linux_study/auto_backup.sh
定时规则解读(5 个星号分别代表 “分 时 日 月 周”):
0 3 * * *
:- 第 1 个
0
:分钟(0 分); - 第 2 个
3
:小时(凌晨 3 点); - 后面 3 个
*
:任意日、任意月、任意周(即 “每天”)。
- 第 1 个
步骤 3:保存退出(Ctrl+O
→回车→Ctrl+X
),crontab 会自动生效。
验证定时任务是否添加成功:
bash
crontab -l # 列出当前用户的定时任务,能看到刚才添加的一行就对了
4. 小技巧:测试定时任务(不用等到凌晨 3 点)
如果想马上测试 “定时任务是否能正常调用脚本”,可以临时设一个 “1 分钟后执行” 的任务:
bash
crontab -e # 编辑定时任务
添加一行(比如当前时间是 10:05,设 10:06 执行):
bash
6 10 * * * ~/linux_study/auto_backup.sh # 注意修改分和时为当前时间+1分钟
保存后等 1 分钟,查看/backup
是否有新备份 —— 有就说明定时任务没问题,之后再改回凌晨 3 点即可。
二、日志轮转:用 logrotate 防止 “日志文件撑爆磁盘”
系统和程序会不断生成日志(比如/var/log/syslog
),如果不清理,日志会越来越大(可能几十 G),最后占满磁盘导致系统崩溃。logrotate
就是 “日志自动清理工具”,像 “垃圾桶定时清空”,会自动压缩、删除旧日志。
1. 什么是日志轮转?
简单说:logrotate
会按规则(比如 “每周一次”“文件超过 100M”)处理日志:
- 把当前日志改名为
xxx.log.1
,新建一个空的xxx.log
继续记录; - 旧日志
xxx.log.1
会压缩成xxx.log.1.gz
; - 保留最近 5 份旧日志,更早的自动删除 —— 既不丢历史记录,又不占太多空间。
2. 实操 1:查看系统默认的日志轮转规则(了解即可)
系统已经给大部分日志配置了轮转规则,存放在/etc/logrotate.d/
目录:
bash
ls /etc/logrotate.d/ # 列出所有配置文件
会看到syslog
(系统日志配置)、nginx
(如果装了)等文件,这些是系统默认的,不用改。
3. 实操 2:给 “自己的日志文件” 配置轮转(比如backup_log.txt
)
场景:你的backup_log.txt
(备份日志)会越来越大,给它配置轮转规则,让它 “超过 1M 就轮转,保留 3 份旧日志”。
步骤 1:创建一个logrotate
配置文件(需要管理员权限):
bash
sudo nano /etc/logrotate.d/my_backup_log # 文件名随便起,最好和日志相关
步骤 2:写入以下配置(复制粘贴,注意日志路径要对):
bash
# 配置~/linux_study/backup_log.txt的轮转规则
/home/你的用户名/linux_study/backup_log.txt { # 你的日志文件绝对路径(必须写全,不能用~)
size 1M # 当文件超过1M时轮转(也可以用weekly表示每周一次)
rotate 3 # 保留3份旧日志,第4份会被删除
compress # 旧日志压缩(变成.gz)
missingok # 如果日志文件不存在,不报错
notifempty # 如果日志是空的,不轮转
create 0644 你的用户名 你的用户名 # 轮转后新建的日志文件权限、所有者、所属组
}
- 注意:
/home/你的用户名/
要替换成你的实际路径(比如/home/zhangsan/
),可以用pwd
查看你的linux_study
绝对路径:bash
pwd ~/linux_study # 会输出类似/home/zhangsan/linux_study,复制这个路径
步骤 3:手动触发轮转测试(不用等自动执行):
bash
sudo logrotate -f /etc/logrotate.d/my_backup_log # -f表示“强制轮转”(测试用)
步骤 4:验证效果:
查看linux_study
目录,会发现:
- 原来的
backup_log.txt
还在(新建的空文件); - 多了一个
backup_log.txt.1.gz
(旧日志被压缩)—— 说明配置生效了!
三、系统状态监控脚本:一键查看 “CPU / 内存 / 磁盘 / 网络” 是否正常
工作中经常需要 “快速检查系统是否正常”,不用一个个输命令,写一个脚本,执行后直接输出关键状态,像 “系统体检报告”。
1. 脚本功能:输出 “CPU 使用率、内存使用率、磁盘使用率、网络连通性”
为什么要这个脚本? 就像你手机的 “一键体检”,点一下就知道 “电池是否正常、内存够不够、网络通不通”,不用自己找各个设置页。
2. 实操:创建system_check.sh
脚本
步骤 1:在linux_study
目录创建脚本:
bash
nano ~/linux_study/system_check.sh
步骤 2:写入以下内容(复制粘贴,带颜色提示更直观):
bash
#!/bin/bash
# 系统状态监控脚本:输出CPU、内存、磁盘、网络状态
echo -e "\033[32m===== 系统状态体检报告($(date))=====\033[0m" # 绿色标题
# 1. CPU使用率(取前5行,过滤掉idle,计算使用率)
echo -e "\033[33m1. CPU使用率:\033[0m" # 黄色标题
cpu_usage=$(top -bn1 | grep "Cpu(s)" | awk '{print 100 - $8 "%"}') # $8是idle(空闲),100-空闲=使用率
echo " 当前CPU总使用率:$cpu_usage"
# 2. 内存使用率
echo -e "\033[33m2. 内存使用率:\033[0m"
mem_usage=$(free -h | grep Mem | awk '{print $3 "/" $2 " (" $3/$2*100 "%)"}') # 已用/总内存(百分比)
echo " 当前内存使用:$mem_usage"
# 3. 磁盘使用率(根目录/)
echo -e "\033[33m3. 磁盘使用率(根目录):\033[0m"
disk_usage=$(df -h / | grep / | awk '{print $3 "/" $2 " (" $5 ")"}') # 已用/总容量(使用率)
echo " 当前磁盘使用:$disk_usage"
# 4. 网络连通性(测试百度)
echo -e "\033[33m4. 网络连通性:\033[0m"
if ping -c 1 www.baidu.com > /dev/null 2>&1; then # ping一次,不输出结果(> /dev/null表示丢弃输出)
echo " 网络正常,能访问百度"
else
echo -e " \033[31m网络异常,无法访问百度\033[0m" # 红色提示错误
fi
echo -e "\033[32m===== 体检结束 =====\033[0m"
步骤 3:加执行权限并运行:
bash
chmod +x system_check.sh
./system_check.sh
预期输出:会彩色显示 CPU、内存、磁盘、网络状态,一目了然 —— 这就是 “一键查系统是否正常” 的基础,工作中可以扩展更多检查项(比如进程是否运行)。
今日必练实操清单(15 分钟搞定)
-
自动备份:
- 按步骤创建
auto_backup.sh
,手动测试能生成备份文件; - 用
crontab -e
设置 “每小时备份一次”(测试用,格式0 * * * *
),1 小时后查看/backup
是否有新备份,没问题再改成凌晨 3 点。
- 按步骤创建
-
日志轮转:
- 给
system_check.sh
的输出日志(比如system_log.txt
)配置轮转规则(参考backup_log.txt
的步骤)。
- 给
-
状态监控:
- 运行
system_check.sh
,截图保存输出,看看你的系统哪些指标正常,哪些需要注意(比如内存使用率是否过高)。
- 运行
今日总结(3 句话记住核心)
- 自动备份:
crontab + tar + 脚本
→ 到点自动备份,命令是0 3 * * * 脚本路径
,再也不怕忘。 - 日志轮转:
/etc/logrotate.d/配置文件
→ 给日志设 “自动清理规则”(大小 / 时间),避免磁盘被撑爆。 - 状态监控脚本:整合
top
/free
/df
/ping
→ 一键输出系统关键状态,排查问题快 10 倍。