首页
关于
Search
1
从零开始学 Linux:终端手记阅读指南
44 阅读
2
修改 Nginx 配置前后,我会检查的六件事
38 阅读
3
Linux 命令行入门:先练熟这 12 个命令
36 阅读
4
systemctl 与 journalctl:服务故障排查的固定顺序
29 阅读
5
Docker 第一次练习:镜像、容器、日志和端口
28 阅读
Linux 入门
命令与学习指引
文件与权限
系统管理
服务与资源管理
Web 与 PHP 配置
MySQL 运维
监控与日志
Shell 自动化
Bash 基础与可靠性
文本与日志处理
定时任务与备份
排错复盘
服务与通知排障
存储与恢复排查
网络基础
连通性与防火墙
HTTP 路由与代理
Web 探测与指标
容器实践
Docker 入门
数据持久化
工具与效率
Git 版本管理
终端与远程工具
登录
Search
标签搜索
Linux
学习路线
新手入门
chmod
文件权限
systemd
Bash
SSH
命令行
软件包管理
磁盘空间
日志分析
阿远
累计撰写
45
篇文章
累计收到
22
条评论
首页
栏目
Linux 入门
命令与学习指引
文件与权限
系统管理
服务与资源管理
Web 与 PHP 配置
MySQL 运维
监控与日志
Shell 自动化
Bash 基础与可靠性
文本与日志处理
定时任务与备份
排错复盘
服务与通知排障
存储与恢复排查
网络基础
连通性与防火墙
HTTP 路由与代理
Web 探测与指标
容器实践
Docker 入门
数据持久化
工具与效率
Git 版本管理
终端与远程工具
页面
关于
搜索到
7
篇与
的结果
2026-10-26
Bash 脚本起步:变量、引号与退出码
写备份脚本时,除了变量与引号,还要处理输出目录嵌套、失败半成品和文件名碰撞。下面只演示普通文件目录的实验备份,不用于在线数据库一致性备份。前提与最小脚本依赖 Bash、GNU realpath、mktemp、tar,准备两个独立测试目录。备份目标不能是源目录或其子目录,否则可能把归档自身打包进去。#!/usr/bin/env bash set -euo pipefail umask 077 [[ $# -eq 2 ]] || { echo '用法:backup.sh 源目录 目标目录' >&2; exit 2; } [[ -d "$1" ]] || { echo '源目录不存在' >&2; exit 1; } source_dir=$(realpath -e -- "$1") mkdir -p -- "$2" backup_dir=$(realpath -e -- "$2") if [[ "$source_dir" == / || "$backup_dir" == "$source_dir" || "$backup_dir" == "$source_dir/"* ]]; then echo '请使用独立的源目录和备份目录;不允许备份根目录' >&2 exit 1 fi tmp=$(mktemp "$backup_dir/backup-$(date +%Y%m%d-%H%M%S)-XXXXXX.partial") trap 'rm -f -- "$tmp"' EXIT tar -czf "$tmp" -C "$source_dir" . gzip -t "$tmp" tar -tzf "$tmp" >/dev/null archive="${tmp%.partial}.tar.gz" [[ ! -e "$archive" ]] || { echo '目标已存在' >&2; exit 1; } mv -- "$tmp" "$archive" printf '已生成:%s\n' "$archive"mktemp 为本次运行生成独立临时文件;成功校验后才改为正式名称。trap 只清理该临时文件,不递归删除目录。此示例没有并发锁与保留策略,不能直接代替本站正式备份。一轮可复现实验先在 ~/linux-lab/source 放两个文本文件,目标选 ~/linux-lab/backup。运行 bash -n backup.sh 检查语法,再执行 bash backup.sh ~/linux-lab/source ~/linux-lab/backup,重复执行应得到不同归档。把归档解到新的空目录,对比文件内容。失败场景源不存在应非零退出;目标在源内部应拒绝;目标不可写时应报错且不留下正式归档。源在打包期间变化可能导致 tar 报错或不一致,重要业务需协调写入。gzip/tar 校验仅证明格式可读,真正恢复还要比较数据。退出码与引号引号保护路径空格,-- 防止路径被当选项,pipefail 保护管道状态。set -e 有上下文例外,不能代替所有显式错误处理。这里的备份是基础练习,不含数据库、跨主机复制或自动恢复。内容复核与修订:2026-10-29。实验示例与本站运行记录分别说明;原始归档日期保留。
2026年10月26日
14 阅读
0 评论
1 点赞
2026-10-26
用 grep、awk、sort 做一次访问日志速查
日志分析不一定要先搭平台。面对一个小型 Nginx 访问日志,命令行可以很快回答三个问题:错误是否集中、哪些地址访问最多、问题从何时开始。以下示例以常见的 combined 日志格式为前提;自定义格式要先核对字段。先看样本,再写命令head -n 3 access.log tail -n 20 access.log确认每行是否包含客户端 IP、时间、请求路径和状态码。不要直接把看不懂的日志交给一条复杂管道。统计状态码awk '{print $9}' access.log | sort | uniq -c | sort -nr在常见 combined 格式中第 9 列是 HTTP 状态码。sort 先把相同值放在一起,uniq -c 才能正确计数。如果你的格式不同,应先用 awk '{print $9}' access.log | head 验证字段。找出 5xx 最集中的客户端awk '$9 ~ /^5/ {print $1}' access.log | sort | uniq -c | sort -nr | head这里的结果只是排查线索。客户端 IP 可能经过代理,也可能是负载均衡器地址;不能据此直接认定某个用户造成故障。再结合时间段、请求路径和应用日志判断。留下可复用的结论把命令、日志格式、时间范围和统计结果放在同一份笔记里。日后日志格式变化时,先更新字段假设,而不是继续相信旧脚本的输出。涉及用户请求和 IP 的原始日志,在公开笔记中先做脱敏。统计口径与预期将文中的 access.log 替换为真实日志文件,先检查样本。awk 输出的 200、404、500 是按空白切分后的第九列,这只适用于约定的日志格式。没有匹配的 5xx 时,管道可能没有输出,这是零条匹配,不代表命令卡死。结果应称请求次数,不是独立访客人数;日志关闭、轮转、代理和爬虫都会改变统计口径。内容复核与修订:2026-10-29。实验示例与本站运行记录分别说明;原始归档日期保留。
2026年10月26日
18 阅读
0 评论
1 点赞
1
2