1. 单机运维命令概述
作为一名有十年经验的系统管理员,我深知单机运维命令是日常工作的基石。这些看似简单的命令行工具,实际上构成了服务器管理的DNA。不同于分布式系统的复杂架构,单机运维更注重对单个系统资源的精细把控,这就要求我们必须熟练掌握各类基础命令的组合运用。
在真实的运维场景中,80%的日常问题都可以通过20%的核心命令解决。我把这些命令比作瑞士军刀上的不同工具——每个都有其特定用途,组合使用又能应对复杂情况。比如排查系统负载高的问题,就需要top、vmstat、iostat等命令配合使用,就像医生需要结合多种检查报告才能准确诊断病情。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 系统状态监控命令
2.1 资源监控三剑客
top命令是我每天使用频率最高的工具之一。它不仅显示CPU和内存使用情况,更重要的是通过交互模式可以实时调整显示内容。我习惯按"1"键查看每个CPU核心的负载,按"M"按内存排序进程。这里有个实用技巧:在~/.toprc中保存个人配置,下次启动时就会自动加载你的偏好设置。
vmstat的输出看似简单,但蕴含丰富信息。关键是要理解各列含义:
code复制procs -----------memory---------- ---swap-- -----io---- -system-- ------cpu-----
r b swpd free buff cache si so bi bo in cs us sy id wa st
特别是wa(IO等待)值,当持续高于5%时就说明磁盘可能成为瓶颈。我通常用vmstat 2 10这样的形式,每2秒采样一次,共10次,这样能观察到系统状态的动态变化。
iostat对存储性能分析不可或缺。重点关注%util和await两个指标:
code复制Device r/s w/s rkB/s wkB/s rrqm/s wrqm/s %rrqm %wrqm r_await w_await aqu-sz rareq-sz wareq-sz svctm %util
vda 0.32 2.63 8.67 42.33 0.00 0.25 0.00 8.70 1.05 1.24 0.00 27.31 16.09 0.31 0.09
当%util接近100%或await明显升高时,说明存储设备已经过载。
2.2 内存分析进阶技巧
free -h以人类可读格式显示内存,但要注意available和free的区别:
code复制 total used free shared buff/cache available
Mem: 7.7G 2.1G 3.2G 456M 2.4G 4.8G
Swap: 2.0G 512M 1.5G
available才是真正可用的内存,因为它考虑了缓存可回收的部分。我见过很多新手误把free值当作内存余量,导致错误判断。
smem -t -p能更直观显示进程内存占用比例:
code复制 PID User Command Swap USS PSS RSS
1234 mysql /usr/sbin/mysqld 1.2% 5.3% 6.1% 7.8%
PSS(Proportional Set Size)是最有参考价值的指标,因为它公平地分摊了共享内存。
3. 存储管理命令
3.1 磁盘空间分析
df -hT显示文件系统类型和使用情况,我总会加上-T参数:
code复制Filesystem Type Size Used Avail Use% Mounted on
/dev/vda1 ext4 50G 32G 16G 67% /
注意Use%超过80%就需要考虑清理或扩容了。对于生产环境,建议设置监控告警阈值在75%。
du -sh * | sort -h是我最常用的空间分析组合:
code复制4.0K lost+found
12M tmp
345M log
2.1G data
sort -h能正确识别人类可读的大小单位,这在分析大容量目录时特别有用。对于特别深的目录树,可以用du -h --max-depth=1控制递归深度。
3.2 文件查找与处理
find命令的强大超乎想象。我常用的几个场景:
bash复制# 查找7天前修改的日志文件
find /var/log -name "*.log" -mtime +7
# 查找大于100MB的文件
find / -type f -size +100M -exec ls -lh {} \;
# 批量修改权限
find /data -type d -exec chmod 755 {} \;
find /data -type f -exec chmod 644 {} \;
grep的进阶用法包括:
bash复制# 显示匹配行及前后3行
grep -A3 -B3 "error" system.log
# 统计出现次数
grep -o "exception" app.log | wc -l
# 递归搜索代码
grep -rn --include="*.py" "import requests" /opt/app
4. 网络诊断命令
4.1 连接状态分析
ss -tulnp比netstat更高效,显示监听端口和进程:
code复制Netid State Recv-Q Send-Q Local Address:Port Peer Address:Port
tcp LISTEN 0 128 0.0.0.0:22 0.0.0.0:* users:(("sshd",pid=1234,fd=3))
重点关注Recv-Q和Send-Q,如果数值持续很高说明可能存在性能问题。
netstat -s显示各种协议的统计信息,对排查网络问题很有帮助:
code复制Tcp:
3245 active connections openings
12 failed connection attempts
23 resets received
4.2 连通性测试
traceroute和mtr用于路径诊断。mtr结合了traceroute和ping的功能:
code复制Host Loss% Snt Last Avg Best Wrst StDev
1. gateway 0.0% 10 0.3 0.4 0.3 0.6 0.1
2. 10.1.2.1 0.0% 10 1.2 1.3 1.1 1.8 0.2
3. 203.0.113.45 30.0% 10 2.1 2.3 2.0 3.1 0.4
发现第3跳有30%丢包,说明该节点可能存在问题。
telnet测试端口连通性虽然简单但实用:
bash复制telnet example.com 80
Trying 93.184.216.34...
Connected to example.com.
Escape character is '^]'.
能连接成功就说明网络和端口都是通的。
5. 系统管理命令
5.1 用户与权限
sudo -l查看当前用户的sudo权限:
code复制User user1 may run the following commands on host1:
(root) /usr/bin/systemctl restart nginx
(root) /usr/bin/vi /etc/nginx/nginx.conf
这在多管理员环境中特别有用,可以避免权限滥用。
getfacl查看详细的ACL权限:
code复制# file: data/file.txt
# owner: user1
# group: group1
user::rw-
user:user2:r--
group::r--
mask::r--
other::---
比传统的ls -l显示更精细的权限控制信息。
5.2 进程管理
ps auxf以树形结构显示进程关系:
code复制user1 1234 0.0 0.5 123456 7890 ? S Jun01 0:00 \_ sshd: user1@pts/0
user1 1235 0.0 0.3 45678 3456 pts/0 Ss Jun01 0:00 | \_ -bash
user1 5678 0.5 2.1 234567 1234 pts/0 Sl 12:34 0:12 | \_ python app.py
这对理解进程父子关系非常有帮助。
**kill -3
code复制"main" #1 prio=5 os_prio=0 tid=0x00007f487400a800 nid=0x1a03 runnable [0x00007f487b7e9000]
java.lang.Thread.State: RUNNABLE
at java.net.SocketInputStream.socketRead0(Native Method)
at java.net.SocketInputStream.socketRead(SocketInputStream.java:116)
这是分析Java应用卡死的利器。
6. 日志分析技巧
6.1 实时日志监控
tail -f配合grep是经典的实时日志监控方案:
bash复制tail -f /var/log/nginx/access.log | grep " 500 "
但更高效的方式是使用multitail工具,它可以同时监控多个日志文件,并支持颜色高亮和过滤。
journalctl对systemd服务的日志管理:
bash复制# 查看最近100行nginx日志
journalctl -u nginx -n 100
# 跟踪实时日志
journalctl -u nginx -f
# 显示特定时间段的日志
journalctl --since "2023-06-01 00:00:00" --until "2023-06-02 12:00:00"
6.2 日志统计与分析
awk是日志分析的瑞士军刀。统计HTTP状态码分布:
bash复制awk '{print $9}' access.log | sort | uniq -c | sort -nr
结果类似:
code复制 200 12456
404 234
500 12
分析响应时间分布:
bash复制# 假设第10列是响应时间(ms)
awk '{print $10}' access.log | sort -n | awk '
{
if ($1 <= 100) a++
else if ($1 <= 500) b++
else c++
}
END {
print "0-100ms:", a
print "100-500ms:", b
print ">500ms:", c
}'
7. 实用命令组合
7.1 性能分析组合拳
当系统突然变慢时,我常用的诊断流程:
bash复制# 1. 快速查看系统负载
uptime; free -h; df -h
# 2. 检查CPU和IO瓶颈
top -H -o %CPU; iostat -x 2 5
# 3. 分析网络连接
ss -tulnp; netstat -s
# 4. 检查最耗资源的进程
ps -eo pid,ppid,cmd,%mem,%cpu --sort=-%cpu | head
7.2 安全检查快捷命令
快速系统安全检查:
bash复制# 检查异常用户
awk -F: '($3 == 0) {print $1}' /etc/passwd
# 检查SUID文件
find / -perm -4000 -type f -exec ls -la {} \; 2>/dev/null
# 检查最近登录
last -n 10
# 检查计划任务
ls -la /etc/cron*; crontab -l
8. 环境配置与调优
8.1 系统参数查看
sysctl -a显示所有内核参数,重点关注:
code复制vm.swappiness = 60
net.ipv4.tcp_max_syn_backlog = 1024
fs.file-max = 6815744
对于数据库服务器,通常需要调整这些参数。
ulimit -a显示用户资源限制:
code复制core file size (blocks, -c) 0
data seg size (kbytes, -d) unlimited
file size (blocks, -f) unlimited
生产环境经常需要增大文件描述符限制。
8.2 时区与时间同步
检查时区配置:
bash复制timedatectl
Local time: Wed 2023-06-14 15:30:00 CST
Universal time: Wed 2023-06-14 07:30:00 UTC
Timezone: Asia/Shanghai (CST, +0800)
验证NTP同步状态:
bash复制chronyc tracking
Reference ID : 0A0B0C0D (ntp1.example.com)
Stratum : 2
Ref time (UTC) : Wed Jun 14 07:30:00 2023
System time : 0.000123 seconds slow of NTP time
9. 备份与恢复
9.1 关键配置文件备份
我习惯用git管理/etc目录:
bash复制cd /etc
git init
git add .
git commit -m "Initial config backup"
之后有任何修改都可以方便地比较差异和回滚。
9.2 数据库备份命令
MySQL备份示例:
bash复制mysqldump -u root -p --single-transaction --routines --triggers \
--all-databases > full_backup_$(date +%Y%m%d).sql
--single-transaction确保一致性,适合InnoDB。
PostgreSQL备份:
bash复制pg_dumpall -U postgres -f pg_backup_$(date +%Y%m%d).sql
10. 硬件信息查询
10.1 CPU与内存详情
lscpu显示CPU架构信息:
code复制Architecture: x86_64
CPU op-mode(s): 32-bit, 64-bit
CPU(s): 8
Thread(s) per core: 2
Core(s) per socket: 4
Model name: Intel(R) Xeon(R) CPU E3-1230 v6 @ 3.50GHz
dmidecode -t memory查看内存插槽和配置:
code复制Memory Device
Size: 16384 MB
Type: DDR4
Speed: 2400 MHz
Locator: DIMM_A1
10.2 磁盘与RAID信息
lsblk -o NAME,SIZE,FSTYPE,MOUNTPOINT显示块设备:
code复制NAME SIZE FSTYPE MOUNTPOINT
vda 50G
├─vda1 40G ext4 /
└─vda2 10G swap [SWAP]
smartctl -a /dev/sda查看磁盘健康状态:
code复制SMART overall-health self-assessment test result: PASSED
Media_Wearout_Indicator: 100%
11. 容器运维命令
11.1 Docker基础操作
查看容器资源使用:
bash复制docker stats --no-stream
CONTAINER ID NAME CPU % MEM USAGE / LIMIT MEM % NET I/O BLOCK I/O
a1b2c3d4e5f6 nginx 0.01% 5MiB / 1GiB 0.5% 1kB / 0B 0B / 0B
查看容器日志:
bash复制docker logs --tail 100 -f container_name
11.2 容器调试技巧
进入容器shell:
bash复制docker exec -it container_name /bin/bash
检查容器网络:
bash复制docker inspect -f '{{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}' container_name
12. 命令使用心得
在实际运维工作中,我总结了几个重要原则:
-
了解原理比记住命令更重要:理解每个命令背后的工作原理,这样即使忘记具体参数也能快速查阅手册解决问题。比如知道vmstat的si/so代表swap in/out,就能快速判断是否发生了内存交换。
-
组合命令创造更大价值:通过管道将简单命令组合起来,可以解决复杂问题。例如
ps aux | grep -v grep | grep nginx | awk '{print $2}' | xargs kill可以优雅地结束所有nginx进程。 -
建立个人命令手册:我维护了一个CheatSheet文件,记录各种实用命令组合和参数说明。随着时间推移,这会成为你最宝贵的知识库。
-
安全第一:执行rm、dd等危险命令前一定要再三确认。我习惯先echo要删除的文件列表,确认无误后再真正执行删除。对于生产环境,可以考虑使用
rm -i交互模式或者设置alias rm='rm -i'。 -
自动化重复工作:把常用的诊断流程写成脚本,比如系统健康检查脚本可以包含前文提到的各种命令,定期运行并记录结果。这不仅能提高效率,还能建立历史基线用于对比分析。
