Linux
一、Linux 概述
1.1 什么是 Linux
Linux 是一个开源的类 Unix 操作系统内核,由 Linus Torvalds 于 1991 年首次发布。基于 Linux 内核的发行版有 CentOS、Ubuntu、Debian、Rocky Linux、AlmaLinux 等。
1.2 Linux 系统架构
应用程序(Shell / GUI / 服务)
│
┌───┴───┐
│ Shell │ ← bash / zsh / fish
└───┬───┘
│
┌───┴───┐
│ 内核 │ ← 进程管理 / 内存管理 / 文件系统 / 网络 / 设备驱动
└───┬───┘
│
┌───┴───┐
│ 硬件 │
└───────┘
1.3 常用发行版
|
发行版 |
包管理器 |
适用场景 |
|---|---|---|
|
Ubuntu / Debian |
apt / dpkg |
开发环境、个人服务器 |
|
CentOS Stream / Rocky Linux |
dnf / yum |
企业级服务器 |
|
Alpine |
apk |
Docker 容器 |
|
Arch Linux |
pacman |
极客/桌面 |
二、文件与目录操作
2.1 ls — 列出目录内容
# 基本用法
ls # 列出当前目录文件和目录(不含隐藏文件)
# 常用选项
ls -l # 长格式,显示权限、所有者、大小、修改时间
ls -a # 显示所有文件(包括 . 开头的隐藏文件)
ls -la # 组合:长格式 + 所有文件
ls -lh # 人类可读的文件大小(K、M、G)
ls -ltr # 按时间排序(最新在最后)
ls -R # 递归显示子目录
ls -i # 显示 inode 号
ls -lS # 按文件大小排序
ls -l 输出解读:
-rw-r--r-- 1 root root 1024 May 20 10:30 file.txt
│ │ │ │ │ │ └── 文件名
│ │ │ │ │ └── 修改时间
│ │ │ │ └── 文件大小(字节)
│ │ │ └── 所属组
│ │ └── 所有者
│ └── 硬链接数
└── 文件类型和权限
- 普通文件 d 目录 l 符号链接
2.2 cd — 切换目录
cd /path/to/dir # 切换到指定目录
cd # 回到 home 目录
cd ~ # 同上
cd - # 回到上一次所在目录
cd .. # 回到上级目录
cd ../.. # 回到上两级目录
cd / # 切换到根目录
2.3 pwd — 显示当前路径
pwd # 显示当前工作目录的完整路径
pwd -P # 显示物理路径(解析符号链接)
2.4 mkdir — 创建目录
mkdir dirname # 创建单个目录
mkdir dir1 dir2 dir3 # 同时创建多个目录
mkdir -p a/b/c/d # 递归创建嵌套目录(父目录不存在时自动创建)
mkdir -m 755 newdir # 创建时指定权限
2.5 touch — 创建文件或更新时间戳
touch file.txt # 创建空文件(文件不存在时)
touch file1.txt file2.txt # 同时创建多个文件
touch -t 202405201030 file.txt # 设置指定时间戳
2.6 cp — 复制文件或目录
cp source.txt dest.txt # 复制并重命名
cp file.txt /path/to/dir/ # 复制到目录(保留原名)
cp file1.txt file2.txt /target/ # 同时复制多个文件
# 常用选项
cp -r dir1 dir2 # 递归复制目录
cp -i file.txt /target/ # 覆盖前询问
cp -u source.txt dest.txt # 仅当源文件更新时才复制
cp -p file.txt /target/ # 保留权限、时间戳等属性
cp -a dir1 dir2 # 归档复制(保留所有属性和符号链接)
cp -v file.txt /target/ # 显示复制过程
2.7 mv — 移动/重命名
# 重命名
mv oldname.txt newname.txt
# 移动文件到目录
mv file.txt /target/dir/
# 多个文件
mv file1.txt file2.txt /target/dir/
# 常用选项
mv -i file.txt /target/ # 覆盖前询问
mv -u file.txt /target/ # 仅当源文件更新时才移动
mv -v file.txt /target/ # 显示过程
2.8 rm — 删除文件或目录
rm file.txt # 删除文件
rm file1.txt file2.txt # 同时删除多个文件
rm -r dirname/ # 递归删除目录及其内容
rm -rf dirname/ # 强制递归删除(危险!需谨慎使用)
rm -i file.txt # 删除前逐个确认
rm -v file.txt # 显示删除过程
警告:rm -rf / 会删除整个系统,绝大多数系统有保护,但依然极度危险!
2.9 cat — 查看/拼接文件内容
cat file.txt # 显示文件全部内容
cat file1.txt file2.txt # 拼接多个文件输出
cat -n file.txt # 显示行号
cat -b file.txt # 对非空行显示行号
cat -s file.txt # 压缩连续的空行为一行
# 创建并写入文件
cat > newfile.txt << EOF
第一行内容
第二行内容
EOF
2.10 head / tail — 查看文件头/尾部
# head — 查看文件开头
head file.txt # 默认显示前 10 行
head -n 20 file.txt # 显示前 20 行
head -c 100 file.txt # 显示前 100 字节
# tail — 查看文件末尾
tail file.txt # 默认显示最后 10 行
tail -n 20 file.txt # 显示最后 20 行
tail -f file.txt # 实时跟踪文件追加内容(日志查看必备)
tail -F file.txt # 跟踪文件(文件被删除重建后自动重新跟踪)
tail -n +5 file.txt # 从第 5 行开始显示到末尾
2.11 more / less — 分页查看文件
# more — 简单分页(只能向前翻页)
more file.txt
# 操作:空格键翻页、Enter 翻行、q 退出
# less — 增强分页(推荐使用)
less file.txt
# 操作:上下箭头滚动、PageUp/PageDown翻页、/搜索、n下个匹配、q退出
less -N file.txt # 显示行号
less +F file.txt # 类似 tail -f 实时模式
less +/keyword file.txt # 打开时定位到第一个匹配
2.12 ln — 创建链接
# 硬链接(同一文件多个入口,不能跨文件系统,不能链接目录)
ln target.txt linkname.txt
# 软链接(符号链接,类似 Windows 快捷方式)
ln -s /path/to/target linkname
ln -s /usr/local/nginx /opt/nginx
# 查看软链接指向
ls -l linkname
readlink -f linkname # 解析最终路径
三、文件权限管理
3.1 权限模型
- rwx rwx rwx
│ │ │ │
│ │ │ └── 其他用户权限 (other)
│ │ └── 所属组权限 (group)
│ └── 所有者权限 (owner)
└── 类型(- 文件 / d 目录 / l 链接)
权限含义:
r (read) = 4 文件:可读取内容 目录:可列出内容
w (write) = 2 文件:可修改内容 目录:可创建/删除文件
x (execute) = 1 文件:可执行 目录:可进入
3.2 chmod — 修改权限
# 数字模式(推荐)
chmod 755 script.sh # rwxr-xr-x(常见目录/执行文件权限)
chmod 644 file.txt # rw-r--r--(常见文件权限)
chmod 600 private.key # rw-------(私密文件)
chmod 777 public/ # rwxrwxrwx(全开放,不推荐)
# 符号模式
chmod u+x script.sh # owner 增加执行权限
chmod g-w file.txt # group 移除写权限
chmod o-rwx file.txt # other 移除所有权限
chmod a+r file.txt # 所有用户增加读权限
chmod u=rwx,g=rx,o= script.sh # 分别设置各角色权限
# 递归修改
chmod -R 755 dirname/
3.3 chown / chgrp — 修改所有者和组
chown user file.txt # 修改文件所有者为 user
chown user:group file.txt # 同时修改所有者和所属组
chown :group file.txt # 仅修改所属组
chown -R user:group dirname/ # 递归修改
chgrp group file.txt # 修改文件所属组
chgrp -R group dirname/ # 递归修改
四、用户和组管理
4.1 用户管理
# 创建用户
useradd username # 基本创建
useradd -m username # 创建 home 目录
useradd -m -s /bin/bash username # 指定 shell
useradd -m -g groupname username # 指定主组
useradd -m -G wheel,docker username # 指定附加组
# 删除用户
userdel username # 删除用户(保留 home 目录)
userdel -r username # 删除用户及其 home 目录
# 设置/修改密码
passwd username # 修改指定用户密码(root)
passwd # 修改当前用户密码
passwd -l username # 锁定用户
passwd -u username # 解锁用户
# 修改用户属性
usermod -L username # 锁定用户
usermod -U username # 解锁用户
usermod -aG docker username # 追加到附加组(-a = append)
usermod -s /bin/zsh username # 修改登录 shell
4.2 组管理
groupadd groupname # 创建组
groupadd -g 2000 groupname # 指定 GID
groupdel groupname # 删除组
4.3 su / sudo — 切换用户
su - username # 切换到指定用户(加载其环境变量)
su - # 切换到 root
sudo command # 以 root 执行
sudo -u username command # 以指定用户身份执行
sudo -i # 进入 root shell
sudo -l # 查看当前用户可执行的 sudo 命令
4.4 相关文件
/etc/passwd # 用户账号信息
/etc/shadow # 加密密码
/etc/group # 组信息
/etc/sudoers # sudo 权限配置(用 visudo 编辑)
五、进程管理
5.1 ps — 查看进程
ps # 显示当前 shell 下的进程
ps aux # 显示所有进程(BSD 风格,最常用)
ps -ef # 显示所有进程(Unix 风格)
ps -ef | grep nginx # 查找特定进程
ps -u username # 显示指定用户的进程
ps -eo pid,comm,%cpu --sort=-%cpu | head # 按 CPU 使用率排序
ps aux 各列含义:
|
列 |
含义 |
|---|---|
|
USER |
进程所有者 |
|
PID |
进程 ID |
|
%CPU |
CPU 使用率 |
|
%MEM |
内存使用率 |
|
VSZ |
虚拟内存大小(KB) |
|
RSS |
物理内存大小(KB) |
|
STAT |
进程状态(R运行/S睡眠/D不可中断/Z僵尸) |
|
START |
启动时间 |
|
TIME |
累计 CPU 时间 |
|
COMMAND |
命令 |
5.2 top / htop — 实时进程监控
top # 启动 top
# 交互命令(在 top 界面内):
# 1 — 显示每个 CPU 核心
# M — 按内存使用率排序
# P — 按 CPU 使用率排序
# k — 输入 PID 杀掉进程
# q — 退出
# 常用启动参数
top -u username # 显示指定用户进程
top -p 1234,5678 # 监控指定 PID
top -d 2 # 每 2 秒刷新一次
# htop(更友好的交互式 top,需额外安装)
htop
5.3 kill / killall — 终止进程
kill PID # 发送 TERM 信号(优雅终止)
kill -9 PID # 发送 KILL 信号(强制终止)
kill -HUP PID # 重新加载配置
# 常用信号
# SIGHUP (1) — 重新加载配置
# SIGINT (2) — 中断(Ctrl+C)
# SIGKILL (9) — 强制终止
# SIGTERM (15) — 优雅终止(默认)
killall processname # 按名称终止所有匹配进程
pkill nginx # 终止所有 nginx 进程
pkill -f "python app.py" # 按完整命令匹配
5.4 后台任务管理
# nohup — 忽略挂断信号
nohup command &
nohup python app.py > app.log 2>&1 &
# & — 在后台运行
command &
# jobs — 查看后台任务
jobs -l # 显示 PID
# fg — 将后台任务调回前台
fg %1
# Ctrl+Z — 将前台任务暂停并放入后台
# bg — 将暂停的任务放到后台继续运行
bg %1
5.5 systemctl — 服务管理(systemd)
systemctl start nginx # 启动服务
systemctl stop nginx # 停止服务
systemctl restart nginx # 重启服务
systemctl reload nginx # 重载配置(不中断服务)
systemctl status nginx # 查看服务状态
systemctl enable nginx # 开机自启
systemctl disable nginx # 禁止开机自启
systemctl list-units --type=service # 列出所有服务
systemctl daemon-reload # 重载 systemd 配置
# 查看日志
journalctl -u nginx # 查看 nginx 日志
journalctl -u nginx -f # 实时跟踪
journalctl -u nginx --since today # 今日日志
六、文本处理
6.1 grep — 文本搜索
# 基本搜索
grep "keyword" file.txt # 在文件中搜索
grep "keyword" file1.txt file2.txt # 多个文件
grep -r "keyword" /path/to/dir/ # 递归搜索目录
# 常用选项
grep -i "keyword" file.txt # 忽略大小写
grep -v "keyword" file.txt # 反向匹配(排除)
grep -n "keyword" file.txt # 显示行号
grep -c "keyword" file.txt # 统计匹配行数
grep -l "keyword" *.txt # 仅显示匹配的文件名
grep -A 3 "keyword" file.txt # 显示匹配行及之后 3 行
grep -B 3 "keyword" file.txt # 显示匹配行及之前 3 行
grep -C 3 "keyword" file.txt # 显示匹配行及前后各 3 行
grep -w "word" file.txt # 精确匹配整个单词
grep -E "pattern1|pattern2" file.txt # 扩展正则(多模式 OR)
# 管道结合(极常用)
ps aux | grep nginx
history | grep "docker"
6.2 find — 查找文件
# 按名称查找
find /path -name "*.log" # 查找 .log 文件
find /path -iname "*.LOG" # 忽略大小写
find /path -name "*.log" -o -name "*.txt" # 或(-o)
# 按类型查找
find /path -type f # 文件
find /path -type d # 目录
find /path -type l # 符号链接
# 按大小查找
find /path -size +100M # 大于 100MB
find /path -size -10k # 小于 10KB
# 按时间查找
find /path -mtime -7 # 7 天内修改过的文件
find /path -mtime +30 # 30 天前修改的文件
find /path -mmin -60 # 60 分钟内修改过的文件
# 按权限查找
find /path -perm 644 # 精确匹配权限
# 对查找结果执行操作
find /path -name "*.log" -mtime +7 -delete # 删除 7 天前的日志
find /path -name "*.txt" -exec ls -lh {} \; # 对每个结果执行命令
find /path -name "*.log" -exec rm -f {} + # 批量删除(+ 更快)
# 查找并排除
find /path -name "*.log" ! -path "*/exclude/*"
6.3 sed — 流编辑器
# 替换(最常用)
sed 's/old/new/' file.txt # 替换每行第一个匹配
sed 's/old/new/g' file.txt # 替换每行所有匹配
sed -i 's/old/new/g' file.txt # 原地修改文件
sed -i.bak 's/old/new/g' file.txt # 原地修改并备份原文件
# 删除行
sed '3d' file.txt # 删除第 3 行
sed '3,5d' file.txt # 删除第 3-5 行
sed '/pattern/d' file.txt # 删除匹配行
sed '/^$/d' file.txt # 删除空行
# 打印指定行
sed -n '5p' file.txt # 打印第 5 行
sed -n '5,10p' file.txt # 打印第 5-10 行
# 插入和追加
sed '3i\新行内容' file.txt # 在第 3 行前插入
sed '3a\新行内容' file.txt # 在第 3 行后追加
6.4 awk — 文本分析工具
# 打印指定列
awk '{print $1}' file.txt # 打印第 1 列
awk '{print $1, $3}' file.txt # 打印第 1 和第 3 列
awk '{print $NF}' file.txt # 打印最后一列(NF = 列数)
# 按分隔符(-F)
awk -F':' '{print $1, $3}' /etc/passwd # 以冒号分隔
awk -F',' '{print $2}' data.csv # 以逗号分隔
# 条件过滤
awk '$3 > 100' file.txt # 第 3 列大于 100 的行
awk '$1 == "nginx"' file.txt # 第 1 列等于 nginx 的行
awk '/pattern/' file.txt # 匹配正则的行
# 统计
awk '{sum+=$3} END {print sum}' file.txt # 第 3 列求和
awk 'END {print NR}' file.txt # 统计行数
awk '{count[$1]++} END {for(i in count) print i, count[i]}' # 分组统计
# 实战:统计 Nginx 日志每个 IP 访问次数
awk '{print $1}' access.log | sort | uniq -c | sort -rn | head -10
6.5 sort / uniq — 排序与去重
# sort
sort file.txt # 升序排序
sort -r file.txt # 降序排序
sort -n file.txt # 按数值排序
sort -k 2 file.txt # 按第 2 列排序
sort -k 2 -n file.txt # 按第 2 列数值排序
sort -t ',' -k 2 data.csv # 指定分隔符
sort -u file.txt # 排序并去重
# uniq(通常先 sort)
sort file.txt | uniq # 去重
sort file.txt | uniq -c # 去重并统计出现次数
sort file.txt | uniq -d # 仅显示重复的行
sort file.txt | uniq -u # 仅显示不重复的行
6.6 wc / cut / tr / tee
# wc — 计数
wc -l file.txt # 行数
wc -w file.txt # 单词数
wc -c file.txt # 字节数
# cut — 列提取
cut -d':' -f1 /etc/passwd # 按分隔符提取列
cut -c1-10 file.txt # 提取每行第 1-10 个字符
# tr — 字符转换
echo "hello" | tr 'a-z' 'A-Z' # 小写转大写
cat file.txt | tr -d '\r' # 删除 Windows 换行符
# tee — 同时输出到终端和文件
command | tee output.txt # 覆盖写入
command | tee -a output.txt # 追加写入
command 2>&1 | tee output.txt # 同时捕获 stderr
七、压缩与归档
7.1 tar — 打包和解包
# 创建压缩包
tar -czf archive.tar.gz dirname/ # .tar.gz(gzip)
tar -cjf archive.tar.bz2 dirname/ # .tar.bz2(bzip2)
tar -cJf archive.tar.xz dirname/ # .tar.xz(xz,最高压缩)
# 解压缩
tar -xzf archive.tar.gz # 解压 .tar.gz
tar -xjf archive.tar.bz2 # 解压 .tar.bz2
tar -xJf archive.tar.xz # 解压 .tar.xz
tar -xzf archive.tar.gz -C /target/dir/ # 解压到指定目录
# 查看压缩包内容(不解压)
tar -tzf archive.tar.gz
参数记忆法:
|
参数 |
含义 |
|---|---|
|
c |
Create(创建) |
|
x |
eXtract(解压) |
|
z |
gZip / j = Bzip2 / J = Xz |
|
f |
File(指定文件名,放在最后) |
|
v |
Verbose(显示过程) |
|
C |
Change directory(指定目标目录) |
7.2 gzip / zip
# gzip
gzip file.txt # 压缩为 file.txt.gz
gzip -k file.txt # 压缩但保留原文件
gzip -d file.txt.gz # 解压
gzip -9 file.txt # 最高压缩级别(1-9,默认 6)
# zip
zip -r archive.zip dirname/ # 压缩目录
unzip archive.zip # 解压
unzip archive.zip -d /target/dir/ # 解压到指定目录
unzip -l archive.zip # 查看压缩包内容
八、磁盘与存储
8.1 df — 查看磁盘空间
df # 查看所有挂载分区(以 KB 为单位)
df -h # 人类可读格式(K/M/G)
df -h /home # 查看指定目录所在分区的用量
df -T # 显示文件系统类型
df -i # 查看 inode 使用情况
8.2 du — 查看目录/文件大小
du -sh dirname/ # 查看目录总大小
du -sh * # 查看当前目录下各项大小
du -sh * | sort -rh # 排序查看
du -h --max-depth=1 # 查看一级子目录大小
du -h --max-depth=2 # 查看两级子目录大小
8.3 mount / lsblk
mount /dev/sdb1 /mnt/data # 挂载分区
mount # 查看所有挂载
umount /mnt/data # 卸载
lsblk # 列出所有块设备(树形结构)
lsblk -f # 显示文件系统类型
fdisk -l # 列出所有磁盘和分区信息
九、网络相关
9.1 ping — 测试网络连通性
ping example.com # 持续 ping(Ctrl+C 停止)
ping -c 4 example.com # 发送 4 次后停止
ping -i 0.5 example.com # 间隔 0.5 秒
# 诊断思路:
# 1. ping 127.0.0.1 — 测试 TCP/IP 协议栈
# 2. ping 本机 IP — 测试网卡
# 3. ping 网关 — 测试局域网
# 4. ping 外网 IP — 测试外网路由
# 5. ping 域名 — 测试 DNS 解析
9.2 curl — 网络请求工具
# GET 请求
curl https://api.example.com/data
# 显示响应头
curl -I https://example.com # 仅响应头
curl -i https://example.com # 响应头 + 响应体
# 显示详细信息
curl -v https://example.com
# POST 请求
curl -X POST https://api.example.com/login \
-H "Content-Type: application/json" \
-d '{"username":"admin","password":"123456"}'
# 下载文件
curl -O https://example.com/file.tar.gz # 保存为原文件名
curl -o myfile.tar.gz https://example.com/file.tar.gz # 另存为
# 认证
curl -u username:password https://api.example.com # Basic Auth
curl -H "Authorization: Bearer token123" https://api.example.com # Bearer Token
# 跟随重定向
curl -L https://example.com
9.3 wget — 文件下载
wget https://example.com/file.tar.gz # 下载文件
wget -O custom.tar.gz https://example.com/file.tar.gz # 指定文件名
wget -c https://example.com/file.tar.gz # 断点续传
wget -b https://example.com/file.tar.gz # 后台下载
wget --limit-rate=1m https://example.com/file # 限速下载
9.4 netstat / ss — 网络连接状态
# netstat(传统工具)
netstat -tlnp # 查看监听端口(TCP)
netstat -ulnp # 查看监听端口(UDP)
netstat -anp | grep :80 # 查看 80 端口连接
# ss — 现代替代方案(更快,推荐)
ss -tlnp # 查看监听端口
ss -an # 查看所有连接
ss -s # 统计摘要
ss -tn state established # 查看已建立的 TCP 连接
ss -tn state time-wait # 查看 TIME_WAIT 连接
TCP 连接状态说明:
|
状态 |
说明 |
|---|---|
|
LISTEN |
服务端等待连接 |
|
ESTABLISHED |
已建立连接,正常通信中 |
|
TIME_WAIT |
主动关闭方等待 2MSL |
|
CLOSE_WAIT |
被动关闭方等待应用层关闭 |
9.5 防火墙
# firewalld(推荐,更友好)
firewall-cmd --state
firewall-cmd --list-all
firewall-cmd --add-port=8080/tcp --permanent
firewall-cmd --add-service=http --permanent
firewall-cmd --reload
# iptables(传统)
iptables -L -n
iptables -A INPUT -p tcp --dport 80 -j ACCEPT
9.6 其他网络诊断
# DNS 查询
nslookup example.com
dig example.com +short
# 路由追踪
traceroute example.com
traceroute -n example.com # 不解析主机名
# 端口测试
nc -zv example.com 80 # 测试端口是否开放
十、包管理
10.1 apt(Debian/Ubuntu)
apt update # 更新软件包索引
apt upgrade # 升级所有可升级的包
apt install package_name -y # 安装
apt remove package_name # 卸载(保留配置文件)
apt purge package_name # 完全卸载
apt autoremove # 移除不再需要的依赖
apt search keyword # 搜索软件包
apt show package_name # 查看包信息
apt list --installed # 查看已安装的包
dpkg -i package.deb # 安装 .deb 包
10.2 yum / dnf(RHEL/CentOS/Rocky)
# dnf(CentOS 8+, Fedora, Rocky,yum 的现代替代)
dnf install package_name -y # 安装
dnf remove package_name # 卸载
dnf update # 更新全部
dnf search keyword # 搜索
dnf history # 查看操作历史
dnf history undo 5 # 撤销第 5 次操作
十一、Shell 脚本基础
11.1 变量
#!/bin/bash
# 定义变量(= 两边不能有空格)
name="world"
num=42
# 使用变量
echo "Hello, $name"
echo "Hello, ${name}" # 推荐写法
# 特殊变量
echo "脚本名: $0"
echo "参数1: $1, 参数2: $2"
echo "参数个数: $#"
echo "上一条命令退出码: $?"
echo "当前进程 PID: $$"
# 命令替换
current_date=$(date +%Y-%m-%d)
echo "今天是 $current_date"
11.2 条件判断
# if 语句
if [ "$name" = "world" ]; then
echo "Hello World"
elif [ "$name" = "linux" ]; then
echo "Hello Linux"
else
echo "Hello Stranger"
fi
# 常用判断条件
# [ -f file ] 文件存在且为普通文件
# [ -d dir ] 目录存在
# [ -e path ] 路径存在
# [ -z "$str" ] 字符串为空
# [ -n "$str" ] 字符串非空
# [ "$a" = "$b" ] 字符串相等
# [ $a -eq $b ] 整数相等
# [ $a -gt $b ] 整数大于
# 数值比较推荐双括号
if (( num > 10 )); then
echo "大于 10"
fi
11.3 循环
# for 循环
for i in 1 2 3 4 5; do
echo "Number: $i"
done
for file in *.txt; do
echo "Processing $file"
done
# while 循环
count=0
while [ $count -lt 10 ]; do
echo "Count: $count"
((count++))
done
# 读取文件每一行
while IFS= read -r line; do
echo "$line"
done < file.txt
11.4 函数
function greet() {
local name="$1" # local 限定作用域
echo "Hello, $name"
}
greet "Alice"
# 返回值(只能是 0-255 的整数)
is_even() {
if (( $1 % 2 == 0 )); then
return 0 # 成功
else
return 1 # 失败
fi
}
if is_even 4; then
echo "是偶数"
fi
十二、系统信息与监控
12.1 系统信息查看
uname -a # 内核版本和系统信息
cat /etc/os-release # 发行版信息
hostnamectl # 主机名和系统信息
uptime # 运行时间和负载
who # 当前登录用户
last # 登录历史记录
lscpu # CPU 信息
free -h # 内存使用概况
12.2 定时任务(crontab)
crontab -e # 编辑定时任务
crontab -l # 查看定时任务
crontab -r # 删除所有定时任务
# 格式:分 时 日 月 周 命令
# * * * * * command
# │ │ │ │ └── 星期(0-7,0和7都是周日)
# │ │ │ └── 月份(1-12)
# │ │ └── 日期(1-31)
# │ └── 小时(0-23)
# └── 分钟(0-59)
# 常用示例
0 2 * * * /opt/backup.sh # 每天凌晨 2 点备份
*/5 * * * * /opt/check.sh # 每 5 分钟执行
0 9-18 * * 1-5 /opt/monitor.sh # 工作日 9-18 点每小时整点
0 0 1 * * /opt/monthly.sh # 每月 1 号执行
@daily /opt/daily_task.sh # 每天一次
@reboot /opt/startup.sh # 开机自启
十三、Docker 部署 Nginx
13.1 Docker 基础命令
# 安装 Docker(Ubuntu)
apt update && apt install docker.io -y
systemctl start docker
systemctl enable docker
# 基础操作
docker pull nginx:latest # 拉取镜像
docker images # 查看本地镜像
docker ps # 查看运行中的容器
docker ps -a # 查看所有容器
docker run -d --name web -p 80:80 nginx # 运行容器
docker stop web # 停止容器
docker start web # 启动容器
docker restart web # 重启容器
docker rm -f web # 强制删除容器
docker rmi nginx:latest # 删除镜像
docker logs -f web # 查看日志
docker exec -it web /bin/bash # 进入容器
docker cp web:/etc/nginx/nginx.conf ./ # 从容器复制文件
docker stats # 实时查看容器资源使用
13.2 Nginx 反向代理配置
# nginx.conf
server {
listen 80;
server_name example.com;
# 反向代理到后端服务
location /api/ {
proxy_pass http://backend:8080/;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
# 超时设置
proxy_connect_timeout 30s;
proxy_send_timeout 30s;
proxy_read_timeout 30s;
}
# 静态文件
location / {
root /usr/share/nginx/html;
index index.html;
try_files $uri $uri/ /index.html;
}
}
13.3 Nginx 负载均衡配置
# 定义上游服务器组
upstream backend {
# 默认算法:轮询(round-robin)
server 192.168.1.10:8080 weight=5;
server 192.168.1.11:8080 weight=3;
server 192.168.1.12:8080 weight=2;
server 192.168.1.13:8080 backup; # 备用
}
# 其他负载均衡算法
# upstream backend {
# least_conn; # 最少连接
# ip_hash; # IP 哈希(会话保持)
# hash $request_uri; # URL 哈希
# }
server {
listen 80;
location / {
proxy_pass http://backend;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
# 健康检查相关
proxy_next_upstream error timeout http_500 http_502 http_503;
proxy_next_upstream_tries 3;
}
# Nginx 状态监控
location /nginx_status {
stub_status on;
allow 127.0.0.1;
deny all;
}
}
13.4 负载均衡算法对比
|
算法 |
指令 |
原理 |
适用场景 |
|---|---|---|---|
|
轮询(默认) |
无需配置 |
按顺序依次分配 |
后端服务器性能一致 |
|
加权轮询 |
weight |
按权重比例分配 |
服务器性能不均 |
|
最少连接 |
least_conn |
发给连接数最少的服务器 |
长连接/WebSocket |
|
IP 哈希 |
ip_hash |
按客户端 IP 固定分配 |
需要会话保持 |
|
URL 哈希 |
hash |
按 URL 固定分配 |
缓存友好 |
13.5 Docker Compose 部署
# docker-compose.yml
version: '3.8'
services:
nginx:
image: nginx:alpine
container_name: nginx-proxy
ports:
- "80:80"
- "443:443"
volumes:
- ./nginx.conf:/etc/nginx/nginx.conf:ro
- ./html:/usr/share/nginx/html
- ./logs:/var/log/nginx
- ./ssl:/etc/nginx/ssl:ro
restart: unless-stopped
networks:
- web
backend1:
image: myapp:latest
container_name: backend1
expose:
- "8080"
restart: unless-stopped
networks:
- web
backend2:
image: myapp:latest
container_name: backend2
expose:
- "8080"
restart: unless-stopped
networks:
- web
networks:
web:
driver: bridge
# 启动
docker-compose up -d
# 查看状态
docker-compose ps
# 扩容后端服务
docker-compose up -d --scale backend=3
# 停止
docker-compose down
十四、常用快捷操作
|
快捷键 |
作用 |
|---|---|
|
Ctrl+C |
终止当前命令 |
|
Ctrl+Z |
暂停当前命令放入后台 |
|
Ctrl+D |
退出终端 / EOF |
|
Ctrl+L |
清屏 |
|
Ctrl+A |
光标移到行首 |
|
Ctrl+E |
光标移到行尾 |
|
Ctrl+U |
删除光标前的内容 |
|
Ctrl+K |
删除光标后的内容 |
|
Ctrl+W |
删除光标前一个单词 |
|
Ctrl+R |
搜索历史命令 |
|
!! |
执行上一条命令 |
|
!$ |
上一条命令的最后一个参数 |
|
Tab |
自动补全 |