Linux命令实战:从原理到排查,掌握系统管理与问题定位

发布时间:2026/7/4 2:55:19
Linux命令实战:从原理到排查,掌握系统管理与问题定位 这类主题最容易写成命令罗列但真正有用的不是背命令而是知道什么时候用什么命令以及命令背后发生了什么。这篇文章不讲几百个命令只围绕几个最核心的场景把命令、原理和排查思路串起来让你下次遇到问题能自己找到路。很多人学 Linux 命令容易陷入两个误区一是只记命令本身不知道它依赖什么环境、输出什么格式、失败时看哪里二是只会在单机上敲不知道在脚本、定时任务、远程会话或生产环境里怎么用才稳。我更建议把命令学习拆成三层第一层是“能跑通”知道基本语法第二层是“能看懂”理解输出结果和常见参数第三层是“能排查”命令失败或结果异常时能按顺序检查权限、路径、资源、依赖和系统状态。下面我会用几个最常碰到的实际任务把命令、原理和现场排查串一遍。1. 先搞清楚你在操作谁系统信息与运行环境查看拿到一台 Linux 服务器不管是要部署应用、排查问题还是做性能评估第一件事不是急着安装软件而是先看清它的“底细”。这包括硬件规格、系统版本、内核、资源使用情况和当前运行的服务。1.1 系统与内核版本别只看uname -auname -a确实常用但它给出的信息比较基础。要判断系统是 CentOS、Ubuntu 还是其他发行版以及具体的版本号需要结合其他命令。# 查看内核版本和机器硬件信息 uname -a # 输出示例Linux myserver 5.4.0-110-generic #124-Ubuntu SMP Thu Mar 2 14:45:02 UTC 2023 x86_64 x86_64 x86_64 GNU/Linux # 这里能看到内核版本(5.4.0-110-generic)、主机名(myserver)、架构(x86_64)和编译时间。 # 查看具体的 Linux 发行版信息 cat /etc/os-release # 这个文件是 systemd 引入的标准文件几乎所有现代发行版都有。 # 输出会包含 NAME, VERSION_ID, PRETTY_NAME 等字段能明确告诉你这是 Ubuntu 22.04 还是 CentOS 7.9。 # 对于 RedHat/CentOS 系还可以用 cat /etc/redhat-release # 对于 Debian/Ubuntu 系可以用 lsb_release -a为什么不能只看uname -a因为内核版本和发行版版本是两回事。一台机器可能运行着较老的内核但系统本身已经更新到了新版本。安装软件包时依赖的是发行版版本而不是内核版本。搞错了容易导致依赖库不匹配。1.2 硬件资源CPU、内存、磁盘的真实容量搜索材料里提到了查看 CPU 和内存的命令这里我补充一些更贴近实战的用法和原理。查看 CPU 信息# 1. 查看物理CPU个数 cat /proc/cpuinfo | grep physical id | sort | uniq | wc -l # 原理/proc/cpuinfo 是内核暴露的虚拟文件physical id 相同的逻辑CPU属于同一个物理CPU。 # 2. 查看每个物理CPU的核数 cat /proc/cpuinfo | grep cpu cores | uniq # 注意这里用的是 uniq 而不是 sort|uniq因为每个物理CPU的核数理论上应该相同。 # 3. 查看逻辑CPU总数物理核数 * 超线程数 cat /proc/cpuinfo | grep processor | wc -l # 或者更简单 nproc # nproc 命令直接输出可用的逻辑处理器数量在脚本中非常方便。 # 4. 查看CPU型号和频率 cat /proc/cpuinfo | grep model name | head -1 # head -1 是因为每个逻辑CPU都会打印一遍取第一个就行。查看内存信息# 查看概要最常用 free -h # -h 参数让输出以人类可读的单位G、M显示。 # 重点看 available 列它表示系统可用内存包括可回收的缓存和缓冲比 free 列更真实。 # 查看详细信息 cat /proc/meminfo # 这里信息非常全包括各种内存状态、页表、交换分区等。通常 free 命令就是从这读取数据。 # 快速查看总内存 grep MemTotal /proc/meminfo查看磁盘信息# 查看磁盘分区和使用情况 df -h # -h 同样是人类可读格式。重点看 Use% 列超过80%就需要警惕。 # 查看具体目录占用空间 du -sh /path/to/directory # -s 是总计-h 是人类可读。常用于排查哪个目录把磁盘撑满了。 # 查看磁盘型号、类型等详细信息需要root权限 sudo fdisk -l # 或者用 lsblk它以树状图显示块设备更清晰。 lsblk原理提示/proc和/sys目录下的文件不是真正的磁盘文件而是内核提供的接口读取它们就是实时从内核获取状态。所以cat /proc/cpuinfo的速度很快且内容总是最新的。1.3 运行状态当前谁在消耗资源知道总资源后更要看当前谁在用。这就是top或htop的用武之地。# 经典的系统监控工具 top # 进入后按 1 可以展开显示所有逻辑CPU的使用情况。 # 按 M 按内存使用排序按 P 按CPU使用排序。 # 按 q 退出。 # 更强大的交互式工具通常需要安装 htop # 它支持鼠标点击、颜色高亮、树状视图比 top 更友好。如果只是要一个快照可以用# 查看系统负载1分钟、5分钟、15分钟的平均值 uptime # 查看内存和交换分区使用情况快照 free -m # 查看磁盘I/O情况需要安装 sysstat 包然后使用 iostat -x 1 2 # -x 显示扩展统计1 是间隔1秒2 是采样2次。排查经验当系统变慢时我一般先ssh登录然后快速运行top看第一行的load average负载平均值。如果这个值持续高于 CPU 逻辑核心数说明系统有排队任务。然后按1看每个 CPU 的%id空闲率如果都很低说明 CPU 是瓶颈。再按M看内存如果free内存很少但available还多问题不大Linux 会充分利用内存做缓存如果available也很少并且swap交换分区使用在增长那很可能是内存不足。2. 文件与目录操作不只是ls和cd文件操作是基础但很多人只记得几个命令对权限、链接、查找和批量处理理解不深。2.1 权限与归属chmod和chown的数字与符号法权限问题是最常见的“坑”之一。ls -l看到的drwxr-xr-x这一串需要拆开看第一位d表示目录-表示普通文件l表示软链接。后面九位每三位一组第一组是文件所有者(u)的权限第二组是同组用户(g)的权限第三组是其他用户(o)的权限。r读(4)w写(2)x执行(1)。数字法修改权限# 将文件设置为所有者可读写执行同组用户可读执行其他用户无权限 chmod 750 myfile # 计算所有者(rwx4217)同组(r-x4015)其他(---0000)符号法修改权限# 给所有用户增加执行权限 chmod ax myfile # 去掉同组和其他用户的写权限 chmod go-w myfile # 设置所有者权限为读写同组和其他为只读 chmod urw,gor myfile修改文件所有者和所属组# 改变文件所有者 sudo chown newuser myfile # 改变文件所属组 sudo chgrp newgroup myfile # 同时改变所有者和所属组 sudo chown newuser:newgroup myfile经验在脚本中我更喜欢用数字法因为它明确、不易出错。在临时调整时可能用符号法更快捷。对于目录如果要递归修改其下所有文件和子目录的权限一定要用-R参数但要非常小心尤其是对根目录或重要系统目录。2.2 查找文件find命令的精准定位find是文件查找的瑞士军刀功能强大但参数也多。# 基本格式find [路径] [匹配条件] [动作] # 1. 按名称查找最常用 find /home -name *.log # 在当前目录及子目录查找所有 .log 文件 find . -name *.log # 2. 按类型查找 find /var -type f -name *.conf # 查找普通文件 find /tmp -type d -name cache* # 查找目录 # 3. 按时间查找用于日志清理、排查最近改动 # 查找7天内修改过的文件 find /opt/app/logs -type f -mtime -7 # 查找恰好30天前修改过的文件 find /opt/app/logs -type f -mtime 30 # 查找超过30天未修改的文件 find /opt/app/logs -type f -mtime 30 # -mtime 是按天-mmin 是按分钟同理还有 -atime访问时间、-ctime状态改变时间。 # 4. 按大小查找 # 查找大于100M的文件 find / -type f -size 100M # 查找小于1K的文件 find . -type f -size -1k # 单位c(字节), k(KB), M(MB), G(GB) # 5. 结合权限查找 # 查找所有具有SUID权限的文件危险 find / -type f -perm /4000 # 查找任何人都可写的文件危险 find / -type f -perm -ow # 6. 对找到的文件执行操作 # 删除7天前的日志文件先echo确认再执行rm find /opt/app/logs -type f -name *.log -mtime 7 -exec echo {} \; find /opt/app/logs -type f -name *.log -mtime 7 -exec rm {} \; # 或者用 -delete 动作更简洁但某些老版本不支持 find /opt/app/logs -type f -name *.log -mtime 7 -delete重要提醒在根目录/下运行find时一定要加上路径限制和明确的匹配条件否则会遍历整个文件系统耗时耗资源还可能遇到权限错误。-exec后面的{}代表找到的文件名\;是命令结束符。2.3 文件内容处理grep,awk,sed三板斧这三个命令是文本处理的灵魂组合使用能解决大部分日志分析和数据提取问题。grep文本搜索# 基本搜索 grep error app.log # 忽略大小写 grep -i error app.log # 显示行号 grep -n error app.log # 递归搜索目录下所有文件 grep -r Connection refused /var/log/ # 只显示匹配的部分而不是整行 grep -o user_[0-9]* app.log # 反向选择显示不匹配的行 grep -v INFO app.logawk按列处理awk把每一行看作由分隔符默认是空格分开的多个字段。# 打印文件的第一列和第三列 awk {print $1, $3} data.txt # 打印最后一列 awk {print $NF} data.txt # 指定分隔符为逗号处理CSV awk -F, {print $2} data.csv # 条件过滤打印第一列大于10的行 awk $1 10 {print $0} data.txt # 内置变量NR行号NF字段数 awk {print NR, NF, $0} data.txtsed流编辑器用于替换、删除、插入# 替换文件中第一次出现的“old”为“new” sed s/old/new/ file.txt # 替换所有出现的“old”为“new” sed s/old/new/g file.txt # 删除包含“pattern”的行 sed /pattern/d file.txt # 删除第2到第5行 sed 2,5d file.txt # 在原文件上直接修改危险通常先备份 sed -i.bak s/old/new/g file.txt # 上面命令会先创建 file.txt.bak 备份然后修改原文件。组合使用示例# 查找nginx日志中状态码为500的请求并统计每个URI出现的次数 grep 500 access.log | awk {print $7} | sort | uniq -c | sort -rn # 分解 # 1. grep 500 匹配状态码500的行注意日志格式500前有空格和引号。 # 2. awk {print $7} 提取第7个字段通常是请求URI。 # 3. sort 排序为 uniq -c 做准备。 # 4. uniq -c 统计每行出现的次数。 # 5. sort -rn 按次数倒序排列。3. 进程与网络管理运行中的任务和连接服务器上跑着各种进程和服务你需要知道如何查看、控制它们以及如何检查网络状态。3.1 进程管理ps,pkill,kill,nohup与查看进程# 最常用的组合显示所有进程并以完整格式显示 ps aux # a 显示所有用户的进程u 显示用户和资源占用x 显示没有控制终端的进程如后台服务。 # 输出列USER, PID, %CPU, %MEM, VSZ, RSS, TTY, STAT, START, TIME, COMMAND # 查找特定进程比如nginx ps aux | grep nginx # 注意这条命令本身也会出现在结果中因为 grep nginx 也是一个进程。 # 更精确的查找排除 grep 自身 ps aux | grep [n]ginx # 或者 ps aux | grep nginx | grep -v grep杀死进程# 优雅终止进程发送SIGTERM信号允许进程清理后退出 kill PID # 强制杀死进程发送SIGKILL信号立即终止无法被捕获或忽略 kill -9 PID # 按名称杀死进程慎用可能误杀 pkill nginx # 或者用 killall killall nginx经验不要一上来就用kill -9。先尝试kill PID给进程一个正常退出的机会。如果进程不响应再等几秒用kill -9。因为SIGKILL信号进程无法处理可能导致资源如临时文件、锁、数据库连接没有正确释放。后台运行与脱离终端# 在命令末尾加 让命令在后台运行 python long_running_script.py # 此时会返回一个作业号如[1]和进程IDPID。 # 但如果你关闭了终端这个后台进程通常也会收到SIGHUP信号而终止。 # 使用 nohup 让进程忽略挂断信号并且将输出重定向到 nohup.out nohup python long_running_script.py # 或者将输出重定向到指定文件 nohup python long_running_script.py output.log 21 # 21 表示将标准错误(2)重定向到标准输出(1)的位置即都输出到 output.log。 # 更现代、功能更全的方式是使用 screen 或 tmux 这类终端复用器。 # 它们可以创建虚拟会话即使断开SSH连接进程仍在会话中运行随时可以重新连接查看。3.2 网络状态netstat,ss,lsof,ping,curl查看端口监听与连接老牌命令是netstat但新系统更推荐sssocket statistics因为它更快直接从内核获取信息。# 查看所有监听端口 sudo netstat -tulnp # -t TCP, -u UDP, -l 监听, -n 数字形式不解析主机名和服务名-p 显示进程名/PID。 # 或者用 ss sudo ss -tulnp查看已建立的连接# 查看所有TCP连接 ss -tna # -a 显示所有监听和非监听。 # 查看连接到特定端口的连接如查看谁在连你的SSH端口22 ss -tna dst :22查看进程打开的文件和网络连接lsof这个命令非常强大可以列出某个进程打开的所有文件、目录、网络连接等。# 查看某个进程如PID为1234打开的文件 lsof -p 1234 # 查看哪个进程在监听80端口 sudo lsof -i :80 # 查看某个用户打开的所有文件 lsof -u username # 查看某个文件被哪个进程占用删除文件时提示“设备忙”就用这个 lsof /path/to/file网络连通性测试# 测试到目标主机的连通性和延迟 ping -c 4 baidu.com # -c 指定发送包的数量。 # 测试TCP端口是否开放比ping更准确因为服务器可能禁ping telnet baidu.com 80 # 如果端口开放会显示连接成功或进入一个空白界面按Ctrl]然后quit退出。 # 更常用的工具是 nc (netcat) nc -zv baidu.com 80 # -z 扫描模式-v 详细输出。 # 下载文件或测试HTTP服务 curl -I http://baidu.com # -I 只获取HTTP头部信息常用于检查Web服务是否正常。 curl -O http://example.com/file.zip # -O 使用远程文件名保存到本地。防火墙管理以iptables为例# 查看当前规则 sudo iptables -L -n -v # -L 列出规则-n 数字显示-v 详细信息。 # 临时开放端口重启后失效 sudo iptables -A INPUT -p tcp --dport 8080 -j ACCEPT # -A INPUT 追加到INPUT链-p tcp 协议TCP--dport 8080 目标端口-j ACCEPT 动作接受。 # 保存规则CentOS/RHEL sudo service iptables save # 或者 sudo /sbin/iptables-save /etc/sysconfig/iptables # 注意现代很多系统使用 firewalld (CentOS/RHEL 7) 或 ufw (Ubuntu) 作为防火墙前端命令不同。4. 系统管理与排错从日常维护到问题定位掌握了基本操作后需要一些更高级的命令和思路来管理系统和解决问题。4.1 服务管理systemctl与service现代 Linux 发行版大多使用systemd作为初始化系统服务管理命令是systemctl。# 查看服务状态 sudo systemctl status nginx # 输出包括是否活跃(active)、是否启用(enabled)、最近的日志片段。 # 启动/停止/重启/重载服务 sudo systemctl start nginx sudo systemctl stop nginx sudo systemctl restart nginx # 先停止再启动 sudo systemctl reload nginx # 重新加载配置不中断服务如果支持 # 设置开机自启/禁止开机自启 sudo systemctl enable nginx sudo systemctl disable nginx # 查看所有已启动的服务 sudo systemctl list-units --typeservice --staterunning # 查看服务的启动日志非常重要 sudo journalctl -u nginx # 查看实时日志 sudo journalctl -u nginx -f # -f 是 follow类似 tail -f。对于尚未迁移到systemd的老系统可能还在用SysVinit脚本使用service命令sudo service nginx status sudo service nginx start经验服务启动失败第一时间看日志。systemctl status会显示一点但更完整的要看journalctl -u service_name。常见失败原因配置文件语法错误、依赖端口被占用、权限不足、依赖服务未启动、磁盘空间满。4.2 日志查看journalctl与tail -f日志是排错的生命线。journalctl(systemd系统的日志)# 查看所有日志从最早开始 sudo journalctl # 查看本次启动后的日志 sudo journalctl -b # 查看指定服务的日志 sudo journalctl -u nginx # 查看指定时间段的日志 sudo journalctl --since 2023-10-01 00:00:00 --until 2023-10-02 12:00:00 # 实时查看新日志 sudo journalctl -f # 查看内核日志 sudo journalctl -k # 按优先级过滤0 emerg, 1 alert, 2 crit, 3 err, 4 warning, 5 notice, 6 info, 7 debug sudo journalctl -p err传统日志文件在/var/log/目录下。/var/log/messages或/var/log/syslog通用系统日志。/var/log/auth.log或/var/log/secure认证和安全相关日志。/var/log/dmesg内核启动和硬件相关消息。/var/log/nginx/access.log和error.logNginx 访问和错误日志其他应用类似。查看这些文件通常用cat,less,tail,grep。# 查看文件末尾并实时刷新最常用 tail -f /var/log/nginx/access.log # 查看文件末尾100行 tail -n 100 /var/log/nginx/error.log # 在日志中搜索特定内容 grep error /var/log/nginx/error.log | tail -204.3 性能监控与排错进阶当系统出现性能问题时需要一套组合拳。vmstat虚拟内存统计# 每2秒采样一次共采样5次 vmstat 2 5关键列r运行队列长度等待CPU的进程数持续大于CPU核心数说明CPU繁忙。b阻塞的进程数通常等待I/O。swpd使用的虚拟内存交换分区大小。si每秒从磁盘读入交换区的内存量swap in。so每秒从交换区写入磁盘的内存量swap out。如果si/so持续不为0说明内存不足开始频繁使用交换分区性能会急剧下降。us,sy,id用户态CPU时间、系统态CPU时间、空闲CPU时间百分比。iostat磁盘I/O统计# 查看所有磁盘的I/O情况每2秒刷新一次 iostat -x 2关键列%util设备利用率I/O请求的时间百分比。接近100%表示磁盘I/O饱和。await平均每次I/O请求的等待时间毫秒。如果这个值很高说明磁盘响应慢。sar系统活动报告需要安装sysstatsar能收集、报告和保存系统活动信息非常适合事后分析。# 查看当天CPU使用情况的历史记录 sar # 查看当天内存使用情况 sar -r # 查看当天磁盘I/O情况 sar -b # 查看网络接口流量 sar -n DEVstrace跟踪系统调用和信号当某个进程行为异常卡死、崩溃、资源泄露时strace可以跟踪它调用了哪些系统函数。# 跟踪一个正在运行的进程 sudo strace -p PID # 跟踪一个新命令的执行 strace ls -l输出会非常详细可以看到文件打开(open)、读写(read/write)、网络连接(connect)、内存分配(brk)等调用。通常用于分析进程卡在哪里比如在等待某个锁或某个慢速的I/O。4.4 计划任务crontab让系统定时执行任务。# 编辑当前用户的crontab crontab -e # 查看当前用户的crontab crontab -l # 删除当前用户的crontab crontab -rcrontab 格式* * * * * command_to_be_executed - - - - - | | | | | | | | | ----- 星期几 (0 - 7) (星期天为0或7) | | | ------- 月份 (1 - 12) | | --------- 日 (1 - 31) | ----------- 小时 (0 - 23) ------------- 分钟 (0 - 59)示例# 每天凌晨2点执行备份脚本 0 2 * * * /home/user/backup.sh # 每5分钟检查一次服务 */5 * * * * /home/user/check_service.sh # 每周一早上8点发送报告 0 8 * * 1 /home/user/send_report.sh重要提醒命令中的路径最好使用绝对路径因为cron的环境变量可能与你的shell环境不同。脚本中如果涉及环境变量如PATH,JAVA_HOME最好在脚本内显式设置。cron 任务的输出默认会以邮件形式发送给用户。如果不需要可以重定向输出0 2 * * * /home/user/backup.sh /dev/null 21调试时可以先让任务每分钟执行一次并查看日志/var/log/cron或journalctl -u cron。5. 实战场景串联从登录到问题定位假设你接到告警一台生产服务器上的Web应用响应变慢。你SSH登录后可以按以下顺序排查快速系统概览uptime # 看负载 free -h # 看内存和Swap df -h # 看磁盘空间如果负载高、内存不足或磁盘快满了问题方向就比较明确。定位资源消耗者top按1看每个CPU按M按内存排序按P按CPU排序。记下占用高的进程PID。深入分析可疑进程# 假设PID是 12345 ps aux | grep 12345 # 看完整命令和参数 lsof -p 12345 # 看它打开了哪些文件、网络连接 strace -p 12345 -c # 统计系统调用-c 汇总模式先不干扰如果进程是Java应用可以用jstack看线程如果是Web服务器看其错误日志。检查网络和端口ss -tulnp | grep :80 # 看80端口谁在监听连接数多不多 ss -tna state established | wc -l # 看总的已建立连接数 sar -n DEV 1 3 # 看网络接口流量是否异常检查应用日志# 假设是Nginx tail -f /var/log/nginx/error.log tail -f /var/log/nginx/access.log # 假设是自定义应用日志在 /opt/app/logs/ tail -f /opt/app/logs/app.log | grep -E (error|timeout|exception)检查依赖服务# 检查数据库连接 mysql -h 127.0.0.1 -u user -p -e SELECT 1; # 简单连通性测试 # 检查缓存服务 redis-cli ping # 检查外部API curl -I https://api.external.com/health历史数据分析# 查看过去一小时的系统负载记录如果配置了sar sar -q -s $(date -d 1 hour ago %H:%M:%S) # 查看磁盘I/O历史 sar -b -s $(date -d 1 hour ago %H:%M:%S)这个流程不是固定的但提供了一个从全局到局部、从现象到根源的排查思路。核心是先看整体资源再找具体进程然后结合日志和网络状态最后验证依赖服务。6. 命令背后的原理与高效学习建议最后想真正掌握命令不能只记语法还要理解一点背后的原理。为什么ps aux和ps -ef都能看进程ps命令历史悠久为了兼容它支持多种选项风格UNIX风格选项前加-如ps -ef。BSD风格选项前不加-如ps aux。GNU风格选项前加--如ps --pid 1。 它们只是同一信息的不同展示方式底层都是读取/proc/PID/下的信息。管道|和重定向,,21的本质管道将前一个命令的标准输出(stdout)作为后一个命令的标准输入(stdin)。重定向标准输出到文件会覆盖文件。重定向标准输出到文件追加到文件末尾。21将标准错误(stderr, 文件描述符2)重定向到标准输出(stdout, 文件描述符1)所在的位置。1表示文件描述符1的当前位置可能是屏幕也可能是文件。/dev/null一个特殊的设备文件写入它的所有数据都会被丢弃。常用于屏蔽命令输出。高效学习命令的建议理解而不是死记记住命令的“模式”而不是每个字母。比如find的基本模式是find 路径 条件 动作。善用--help和man遇到新命令先command --help看常用选项再man command看完整手册。man手册中SYNOPSIS部分是语法概要DESCRIPTION是详细描述EXAMPLES部分常有实用例子。使用命令补全和历史在 Bash 中按Tab键可以补全命令、文件名、参数。按CtrlR可以反向搜索历史命令。把常用操作写成脚本或别名如果你经常需要执行一长串命令把它写进一个 Shell 脚本或者添加到~/.bashrc中的别名里。# 在 ~/.bashrc 中添加 alias llls -alhF alias grepgrep --colorauto alias myapplogtail -f /opt/app/logs/app.log # 然后执行 source ~/.bashrc 生效。在安全环境练习尽量在虚拟机、容器或个人开发服务器上练习危险命令如rm -rf /,chmod -R 777 /,dd等生产环境操作前务必三思最好先echo或ls预览一下。命令是工具思路才是关键。面对一台陌生的 Linux 服务器清晰的排查路径和对自己敲下的每个命令的理解比背下所有命令参数更重要。先从最常用的二三十个命令开始理解它们的输出知道失败时该看哪里然后通过实际场景不断积累自然就能融会贯通。