文章

Linux 命令实战笔记

在 [程序员面试吧] 公众号中找到的 Linux 命令实战笔记

Linux 命令实战笔记

原文: 阿里P7运维工程师私藏的Linux实战笔记(建议收藏)

1. 基础命令

这里只记录我不了解的, 若要看所有的, 请移步到公众号

1.1. 最基础命令 (必须掌握)

1
2
3
4
5
# 文件内容查看
less file.txt       # 分页查看 (大文件)
head -n 20 file     # 查看前 20 行
tail -f logfile     # 实时查看日志
grep "error" file   # 搜索关键字

组合使用: 查找最近修改的配置文件

1
find /etc -type f -name "*.conf" -mtime -7 | xargs ls -lt
  • -mtime -7: 筛选时间, 7 天内被修改过的文件
  • xargs: 转换工具; 将 find 输出的文件变成 ls 命令参数
  • -lt: -l - 长格式显示; -t: 按修改时间排序

1.2. 管道重定向

  • 管道: |
  • 重定向: >, >>, <
1
2
3
4
5
6
7
8
9
10
11
12
13
14
# 统计 nginx 日志中404错误的数量
cat access.log | grep "404" | wc -l

# 查找占用CPU最高的前10个进程
ps aux | sort -k3 -rn | head -10

# 实时监控特定关键字的日志
tail -f /var/log/app.log | grep --line-buffered "ERROR"

# 将错误输出重定向到文件
command 2> error.log

# 同时重定向标准输出和错误输出
command &> all_output.log

1.3. 文本处理

文本处理三剑客: grep, sed, awk;

grep: 文本搜索工具; 在文件或输入流中查找匹配模式的行; 支持基本和扩展正则表达式

用法:

  • 参数: -i (ignore-case)
    • 功能: 忽略字符大小写。
    • 示例: (查找包含 error、Error 或 ERROR 的行). grep -i "error" /var/log/syslog
  • 参数: -v (反相匹配)
    • 功能: 反向搜索,只显示不匹配的行。
    • 示例: (查看进程时排除 grep 进程本身)。ps -ef | grep -v "grep"
  • 参数: -r(递归)
    • 功能: 递归搜索目录下的所有文件。
    • 示例: (在 src 目录及其子目录下查找包含 main 的文件)。grep -r "main" ./src
  • 参数: -n(行号)
    • 功能: 显示匹配行在文件中的行号。
    • 示例: (查找 config 并标注其所在的行号)。grep -n "config" setup.sh
  • 参数: -E (exted-regexp)
    • 功能: 使用扩展正则表达式(等同于 egrep)。
    • 示例: (查找包含 cat 或 dog 的行)。grep -E "cat|dog" file.txt

sed: 流编辑器; 对文本进行增删改查;支持正则表达式;非交互式批量处理。

用法:

  • 参数:-i (in-place)
    • 功能: 直接修改源文件内容。
    • 示例: sed -i 's/abc/xyz/g' test.txt (将 test.txt 中所有 abc 替换为 xyz 并保存)。
  • 参数:-n (quiet)
    • 功能: 取消默认的全文输出,仅显示处理后的行。
    • 示例: sed -n '5,10p' file.txt (仅打印第 5 到 10 行)。
  • 参数:-e (expression)
    • 功能: 在一条命令中执行多个编辑操作。
    • 示例: sed -e '1d' -e 's/old/new/' file.txt (删除第一行,并替换余下内容中的 old)。
  • 命令动作:s (substitute)
    • 功能: 替换文本。
    • 示例: sed 's/^/#/' file.txt (在每行开头加 # 号,常用于批量注释)。
  • 命令动作:d (delete)
    • 功能: 删除指定行。
    • 示例: sed '/ERROR/d' log.txt (删除所有包含 ERROR 的行)。

awk: 文本处理工具/编程语言; 对文本进行样式扫描与列处理;支持算术运算、逻辑判断及内置函数。

用法:

  • 参数-F (Field Separator)
    • 功能: 指定输入行的分隔符(默认为空格/制表符)。
    • 示例: (以冒号分割,打印第一列用户名)。awk -F: '{print $1}' /etc/passwd
  • 参数-v (Variable)
    • 功能: 设置用户自定义变量或引入外部变量。
    • 示例: (筛选磁盘使用率大于 80 的行)。awk -v threshold=80 '$5 > threshold' df_out.txt
  • 内置变量$0$NNF, NR
    • 功能: 指整行, 指第 N 列, 指列数, 指行号。$0$NNFNR
    • 示例: (打印行号和最后一列)。awk '{print NR, $NF}' file.txt
  • 模式匹配/pattern/
    • 功能: 只处理匹配到正则的行。
    • 示例: (查找含 Listen 的行并打印第二列)。awk '/Listen/ {print $2}' config.txt
  • 块作BEGIN / 结束
    • 功能: 在处理文本前或结束后执行的作。
    • 示例: (对第一列求和并在最后输出)。awk '{sum+=$1} END {print sum}' data.txt

组合使用: 分析 Web 日志, 查找访问量最大的 10 个 IP:

1
awk '{print $1}' access.log | sort | uniq -c | sort -rn | head -10

2. 进程管理

2.1. 进程管理和监督

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
# 查看进程
ps aux				# 查看所有进程
ps -ef | grep nginx	# 查找特定进程
pstree				# 树形显示进程关系

# 实时监控
top		# 经典监控工具
htop	# 更友好的界面
iotop	# IO监控
iftop	# 网络流量监控

# 进程控制
kill -9 PID				# 强制终止进程
killall process_name	# 按名称终止进程
nice -n 10 command		# 以低优先级运行
renice -n 5 -p PID		# 调整运行中进程优先级

2.2. 后台任务管理

当需要运行长时间任务:

1
2
3
4
5
6
7
8
9
10
11
# 后台运行
command &				# 后台运行
nohup command &			# 断开终端后继续运行
screen -S session_name	# 创建会话(推荐)
tmux new -s myproject	# tmux会话(更强大)

# 任务控制
jobs                          # 查看后台任务
fg %1                         # 将任务调到前台
bg %1                         # 将任务放到后台
disown %1                     # 将任务与终端分离

[!Note]

对于生产环境的长时间任务, 始终使用 screentmux, 这样即使网络断开也不会影响任务执行.


3. 系统性能分析

3.1. CPU 性能分析

1
2
3
4
5
6
7
8
# CPU使用率监控
vmstat 1                      # 每秒更新一次
mpstat -P ALL 1              # 多核CPU监控
sar -u 1 10                  # 收集10秒CPU数据

# 进程CPU分析
pidstat -u 1 -p PID          # 特定进程CPU使用
perf top                     # 实时性能分析

3.2. 内存管理与优化

1
2
3
4
5
6
7
8
9
10
11
# 内存使用情况
free -h					# 人类可读格式
cat /proc/meminfo		# 详细内存信息
vmstat -s				# 内存统计

# 内存问题排查
slabtop							# 内核内存使用
ps aux --sort=-%mem | head		# 内存使用最多的进程

# 清理缓存(慎用)
sync && echo 3 > /proc/sys/vm/drop_caches

3.3. 磁盘 I/O 优化

1
2
3
4
5
6
7
8
9
10
11
12
# 磁盘使用情况
df -h                       # 文件系统使用情况
du -sh *                    # 目录大小
lsblk                       # 块设备列表

# I/O性能分析
iostat -x 1                 # 详细I/O统计
iotop -o                    # 只显示有I/O的进程
dstat -d                    # 磁盘统计

# 查找大文件
find / -type f -size +1G 2>/dev/null

[!Note]

系统变慢时, 排查顺序:

  1. top: 查看 CPU, 内存
  2. iostat: 检查磁盘 IO
  3. netstat or ss: 检查网络连接
  4. 查看系统日志

4. 网络配置, 诊断

4.1. 网络配置 & 诊断

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
# 网络配置
ip addr show			# 查看IP地址
ip route show			# 查看路由表
nmcli device status		# NetworkManager状态

# 网络诊断
ping -c 4 google.com	# 测试连通性
traceroute google.com	# 路由追踪
mtr google.com			# 结合ping和traceroute
dig google.com			# DNS查询
nslookup google.com		# DNS查询(经典)

# 端口和连接
netstat -tuln			# 监听端口
ss -tuln				# 更快的netstat替代
lsof -i :80				# 查看使用80端口的进程
telnet host port		# 测试端口连通性
nc -zv host port		# netcat端口扫描

4.2. 防火墙管理

1
2
3
4
5
6
7
8
9
# iptables(传统)
iptables -L -n -v								# 查看规则
iptables -A INPUT -p tcp --dport 80 -j ACCEPT	# 允许80端口

# firewalld(现代)
firewall-cmd --state						# 查看状态
firewall-cmd --list-all						# 查看所有规则
firewall-cmd --permanent --add-port=80/tcp	# 永久开放端口
firewall-cmd --reload						# 重载配置

5. 服务管理

5.1. Systemctl 服务管理

现在常用

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
# 服务控制
systemctl start nginx      # 启动服务
systemctl stop nginx       # 停止服务
systemctl restart nginx    # 重启服务
systemctl reload nginx     # 重载配置
systemctl status nginx     # 查看状态

# 开机自启
systemctl enable nginx     # 设置开机自启
systemctl disable nginx    # 取消开机自启
systemctl is-enabled nginx # 查看是否自启

# 服务日志
journalctl -u nginx        # 查看服务日志
journalctl -f -u nginx     # 实时查看日志
journalctl --since "2024-01-01" -u nginx  # 时间范围

5.2. 创建自定义服务

# /etc/systemd/system/myapp.service
[Unit]
Description=My Application
After=network.target

[Service]
Type=simple
User=appuser
WorkingDirectory=/opt/myapp
ExecStart=/opt/myapp/start.sh
Restart=on-failure
RestartSec=10

[Install]
WantedBy=multi-user.target

6. 日志管理

6.1. 日志查看 & 分析

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
# 系统日志位置
/var/log/syslog           # 系统日志(Debian/Ubuntu)
/var/log/messages         # 系统日志(RHEL/CentOS)
/var/log/auth.log         # 认证日志
/var/log/kern.log         # 内核日志

# 日志分析技巧
# 查找错误
grep -i error /var/log/syslog | tail -20

# 统计日志级别
awk '{print $5}' /var/log/syslog | sort | uniq -c | sort -rn

# 时间范围过滤
sed -n '/2024-01-01 10:00/,/2024-01-01 11:00/p' logfile

6.2. 日志轮转设置

配置 logrotate 管理日志大小:

1
2
3
4
5
6
7
8
9
10
11
12
13
# /etc/logrotate.d/myapp
/var/log/myapp/*.log {
    daily
    rotate 7
    compress
    delaycompress
    missingok
    notifempty
    create 0644 root root
    postrotate
        systemctl reload myapp
    endscript
}

7. 用户和权限管理

7.1. 用户管理

1
2
3
4
5
6
7
8
9
10
# 用户操作
useradd -m -s /bin/bash username	# 创建用户
passwd username						# 设置密码
usermod -aG sudo username			# 添加到sudo组
userdel -r username					# 删除用户及主目录

# 查看用户信息
id username			# 用户ID和组
who					# 当前登录用户
last				# 登录历史

7.3. 权限管理

1
2
3
4
5
6
7
8
9
10
11
12
13
# 文件权限
chmod 755 file                    # rwxr-xr-x
chmod u+x file                    # 给用户添加执行权限
chown user:group file             # 改变所有者

# 特殊权限
chmod u+s file                    # SUID
chmod g+s directory               # SGID
chmod +t directory                # Sticky bit

# ACL(访问控制列表)
setfacl -m u:username:rwx file    # 设置ACL
getfacl file                      # 查看ACL

[!Caution]

不要给文件777权限

本文由作者按照 CC BY 4.0 进行授权