ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

Linux常用命令与操作详解:从排障到脚本的体系化实战

Linux常用命令与操作详解:从排障到脚本的体系化实战 简介这份资源是面向Linux终端操作员、技术支持工程师及初学者的命令速查文档聚焦日常运维与脚本编写中的实际问题帮助读者在遇到文件管理、进程控制、网络排查等场景时快速定位合适命令。包内共1个docx文件压缩包约18KB以文档形式系统整理命令用法便于随查随用。内容覆盖文件与目录操作创建、复制、移动、删除、系统状态查看与进程管理、文本内容分页查看与检索、权限与所属关系修改、压缩解压以及重定向、管道、通配符等符号指令和常用快捷键并配有简洁示例说明语法。已有320人学习适合希望提升终端操作效率、构建复杂Shell脚本的读者作为案头参考也可用于排查具体操作问题时的快速对照。1. 从一次线上故障说起为什么 Linux 命令必须成体系地学上周帮朋友处理一台跑了两年的国产 Linux 服务器磁盘告警、进程僵死、日志写满他敲了df -h看到/分区 100%第一反应是rm -rf /var/log/*结果把正在写入的日志文件句柄搞成了 deleted 状态空间没释放服务还挂了。这个场景我见过太多次——不是命令不会敲而是命令之间没有形成体系不知道df和du的差异、不知道lsof能查已删除文件、不知道systemctl和journalctl怎么配合定位。Linux 常用命令与操作详解这个标题讲的不是背命令手册而是把文件、进程、网络、权限、包管理这几条线串成一套能排障、能复现、能迁移的操作体系。适合刚接手服务器的新手也适合敲了几年命令但遇到故障还是靠重启的运维。下面按我实际排障的顺序拆开讲每一步都落到能直接抄的命令和参数上。2. 文件与目录操作从 cd 到 find 的完整链路2.1 路径、查看与切换的底层逻辑Linux 一切皆文件路径分绝对路径以/开头和相对路径以.或..开头。cd切换目录时cd -回到上一次目录cd ~回家目录cd ..上一级。查看目录内容用ls但真正干活时我常用组合参数# -l 长格式-a 显示隐藏文件-h 人类可读大小-t 按修改时间排序 ls -laht /var/log # 只看目录本身而不是内容 ls -ld /var/log # 递归查看并显示 inode ls -liR /etc | head -50-h让ls -l的字节数变成 K/M/G-t把最近修改的排最前排查日志时非常顺手。-i显示 inode 号硬链接和文件恢复场景会用到。注意ls -l第一列第一个字符-普通文件d目录l软链接c字符设备b块设备ssocketp管道。创建和删除要分清mkdir -p递归建目录、rmdir只能删空目录、rm -rf递归强制删慎用。我一般会先ls确认再删或者用rm -ri交互确认。复制cp -a保留权限、时间戳、软链接比cp -r更适合备份。移动mv同分区是重命名跨分区是复制加删除。2.2 find、grep、xargs 三件套的实战组合find按条件找文件grep按内容过滤xargs把结果传给下一个命令。这三个组合能解决 80% 的批量操作。# 找 /data 下 7 天前修改、大于 100M 的 .log 文件 find /data -type f -name *.log -mtime 7 -size 100M # 找到后删除-print0 和 -0 处理带空格的文件名 find /data -type f -name *.log -mtime 7 -size 100M -print0 | xargs -0 rm -f # 在所有 .conf 文件里搜 listen 关键字显示行号 grep -rn listen /etc/nginx/ --include*.conf # 统计当前目录下每个子目录的文件数 find . -maxdepth 1 -type d -exec sh -c echo -n {}: ; ls -1 {} | wc -l \;-mtime 7是 7 天前-mmin -30是 30 分钟内。-size 100M单位是 M大于-小于。-print0用 null 分隔避免文件名含空格时xargs拆错。grep -r递归-n行号--include限定文件类型。-exec后面用{}代表找到的文件\;结束注意转义。提示find的-delete比管道xargs rm更安全因为它自带-depth且不会因文件名特殊字符出错但确认条件无误再用。2.3 权限与属主chmod、chown、umask 的边界权限用rwx表示读 4、写 2、执行 1三组分别对应属主、属组、其他人。chmod 755 file是属主 rwx、组和其他 r-x。chmod ux给属主加执行。目录的执行位x表示能进入没有x连cd都进不去。# 递归把 /web 属主改为 www属组改为 www chown -R www:www /web # 给所有 .sh 文件加执行权限 chmod x *.sh # 查看当前 umask新建文件默认权限 666 - umask目录 777 - umask umask # 临时设置 umask 为 022 umask 022chown改属主属组chmod改权限。umask决定新建文件的默认权限生产环境常设 022 或 027。特殊权限位SUID4执行时以属主身份、SGID2目录下新建文件继承属组、Sticky1只有属主能删自己文件如/tmp。chmod 4755就是加 SUID。注意chmod -R 777是血泪教训里的常客它让任何用户都能改任何文件线上环境基本等于开门。真需要共享目录用属组加2775更合理。3. 进程与系统资源ps、top、kill 的排障路径3.1 进程查看ps 与 top 的分工ps是快照top是实时。ps aux看所有进程ps -ef看父子关系。我排障时先ps aux --sort-%cpu | head找 CPU 高的再ps aux --sort-%mem | head找内存高的。# 按 CPU 降序看前 10 个进程 ps aux --sort-%cpu | head -11 # 看进程树显示 PID 和 PPID ps -ef --forest | head -30 # 查某个进程的详细信息包括启动时间和完整命令 ps -p 1234 -o pid,ppid,user,%cpu,%mem,lstart,cmdps aux的列USER、PID、%CPU、%MEM、VSZ虚拟内存、RSS物理内存、TTY、STAT、START、TIME、COMMAND。STAT 里R运行、S睡眠、D不可中断、Z僵尸、T停止。D状态多说明 IO 卡住Z多说明父进程没回收子进程。top交互键P按 CPU 排序M按内存排序1展开每个 CPU 核c显示完整命令k杀进程q退出。top -b -n 1批处理模式输出一次适合脚本采集。3.2 信号与 kill-9 不是万能药kill发信号默认-15SIGTERM让进程优雅退出-9SIGKILL强制杀。我一般先-15等几秒不退再-9。kill -l列出所有信号。# 优雅停止 kill -15 1234 # 等 3 秒还没退就强制 sleep 3 kill -9 1234 2/dev/null # 按名字杀所有 java 进程先确认再杀 pgrep -a java pkill -15 java # 杀整个进程组负号表示进程组 ID kill -15 -1234pgrep按名字查 PIDpkill按名字杀。killall类似但更老。注意-9会让进程没机会写日志、释放锁、清理临时文件数据库进程尤其慎用可能触发恢复流程。3.3 内存、磁盘、负载free、df、du、iostatfree -h看内存重点看available而不是free因为 buff/cache 可回收。df -h看分区使用率du -sh *看当前目录各子项大小。磁盘 IO 用iostat -x 1看%util和await。# 内存每秒刷新 free -h -s 1 # 找 / 下最大的 10 个目录 du -xh / --max-depth1 2/dev/null | sort -rh | head -10 # 磁盘 IO每 1 秒一次共 5 次 iostat -x 1 5 # 查看已删除但被进程占用的文件 lsof L1 2/dev/null | head -20du -x不跨文件系统避免扫到挂载的 NAS。sort -rh按人类可读大小逆序。lsof L1找 link count 为 1 的已删除文件这是df满但du不大的经典原因——文件被删了但进程还开着句柄空间不释放重启对应进程即可。提示负载load average三个值分别是 1、5、15 分钟平均。单核负载超过 1 就排队但要看是 CPU 密集还是 IO 等待结合top的%wa判断。4. 网络与服务从 ip 到 systemctl 的排查顺序4.1 网络配置与连通性测试ip addr看网卡和 IPip route看路由ip link看链路状态。老命令ifconfig、route在部分国产 Linux 上已不默认安装建议用ip系列。# 看所有网卡 IP ip -br addr # 看默认路由 ip route show default # 测试连通性-c 次数-W 超时秒 ping -c 4 -W 2 8.8.8.8 # 追踪路由-n 不解析域名 traceroute -n 8.8.8.8 # 看端口监听-t TCP-u UDP-l 监听-n 不解析-p 显示进程 ss -tulnpss比netstat快-s看统计摘要。telnet测端口telnet 10.0.0.1 3306通了显示 Connected不通看是 refused 还是 timeout——refused 是端口没开timeout 是防火墙或网络不通。curl -v看 HTTP 请求全过程-I只看响应头-o /dev/null -s -w %{http_code} %{time_total}\n输出状态码和耗时。4.2 systemctl 与 journalctl服务管理标配现代 Linux 用 systemd 管服务。systemctl start/stop/restart/status/enable/disable是基本操作enable开机自启disable取消。# 看服务状态-l 显示完整日志 systemctl status nginx -l # 重启并看是否成功 systemctl restart nginx systemctl is-active nginx # 看服务日志-u 指定 unit-f 跟随--since 时间范围 journalctl -u nginx -f journalctl -u nginx --since 2024-01-01 00:00:00 --until 2024-01-01 01:00:00 # 看本次启动的所有错误 journalctl -p err -bjournalctl -p err按优先级过滤-b本次启动-b -1上次启动。日志占空间大时journalctl --vacuum-size500M清理到 500M。systemctl list-units --failed看所有失败单元。4.3 防火墙与 SELinux两个最容易忽略的拦路虎firewalld用firewall-cmdufw用ufwiptables直接操作规则。国产 Linux 常见firewalld。# 看当前区域和开放端口 firewall-cmd --list-all # 永久开放 8080/tcp firewall-cmd --permanent --add-port8080/tcp firewall-cmd --reload # ufw 看状态和开放 ufw status verbose ufw allow 8080/tcp # 临时关闭 SELinux 排查 getenforce setenforce 0 # 永久改配置文件 /etc/selinux/config 的 SELINUXpermissiveSELinux 的getenforce返回 Enforcing 时很多服务起不来但日志不直观。ausearch -m avc -ts recent看拒绝记录setsebool或semanage调整策略。排查阶段可临时setenforce 0但生产环境不建议长期关闭。注意firewall-cmd --reload会重载配置已建立的连接可能中断尽量在维护窗口操作。5. 避坑与常见问题那些让我加班到凌晨的细节5.1 rm -rf 变量为空导致删根现象脚本里rm -rf $DIR/*$DIR未定义或为空变成rm -rf /*。原因变量没加引号也没做非空校验。解决脚本开头set -u删除前[ -n $DIR ] || exit 1或用rm -rf ${DIR:?}${VAR:?}在变量为空时报错退出。5.2 df 显示满但 du 找不到大文件现象df -h显示/100%du -sh /*加起来远不到。原因文件被删除但进程仍持有句柄空间未释放。解决lsof L1找到 deleted 文件对应的 PID重启该进程或 /proc/PID/fd/N清空。常见于日志文件被rm而不是truncate。5.3 中文乱码与 locale 未设置现象ls中文文件名显示问号脚本处理中文报错。原因LANG和LC_ALL未设或设为C。解决locale -a看可用语言export LANGzh_CN.UTF-8或en_US.UTF-8写入/etc/locale.conf永久生效。注意有些国产 Linux 需先localedef生成。5.4 软链接用相对路径导致失效现象ln -s /data/app/config /etc/app/config后移动目录链接失效。原因软链接存的是路径字符串绝对路径移动后指向错误。解决用readlink -f看真实指向ln -sfn重建。跨机器部署尽量用相对路径或部署脚本重建链接。5.5 kill -9 数据库进程后起不来现象MySQL 被kill -9后启动报错日志提示恢复。原因-9不给进程清理机会InnoDB 需要 crash recovery。解决等恢复完成或从备份恢复。预防数据库用systemctl stop或mysqladmin shutdown给足-15时间。6. 把命令串成脚本一个日志清理与磁盘巡检的实战模板前面都是单点命令真正省时间的是把它们写成可复用的脚本。下面这个模板我放在每台服务器的/usr/local/bin/disk_check.sh配合 cron 每天跑输出异常才告警。#!/bin/bash # 磁盘巡检与日志清理保留最近 7 天阈值 85% set -euo pipefail THRESHOLD85 LOG_DIR/var/log/app KEEP_DAYS7 # 1. 检查各分区使用率 df -hP | awk -v t$THRESHOLD NR1 $50t {print ALERT: $6 usage $5} # 2. 清理旧日志先删 7 天前的 .log再压缩 3 天前的 find $LOG_DIR -type f -name *.log -mtime $KEEP_DAYS -print0 | xargs -0 rm -f find $LOG_DIR -type f -name *.log -mtime 3 ! -name *.gz -print0 | xargs -0 gzip # 3. 检查已删除但未释放的文件 lsof L1 2/dev/null | awk NR1 {print $1, $2, $7} | sort -k3 -rh | head -5 # 4. 检查 failed 服务 systemctl list-units --failed --no-legend # 5. 输出内存和负载 free -h | awk NR2 {print Mem used: $3/$2} uptime | awk -Fload average: {print Load:$2}set -euo pipefail让脚本遇错退出、未定义变量报错、管道任一环节失败即失败。df -hP的-P保证一行一个分区方便awk解析。$50把百分比字符串转数字比较。find -print0 | xargs -0处理特殊文件名。lsof L1输出按第 7 列大小逆序找占用最多的已删除文件。systemctl --failed --no-legend去掉表头直接输出失败单元。参数调整THRESHOLD按业务定数据库服务器可设 80日志服务器可设 90。KEEP_DAYS结合磁盘大小和日志增速先du -sh看日均增量再定。cron 写法0 3 * * * /usr/local/bin/disk_check.sh /var/log/disk_check.log 21每天凌晨 3 点跑输出追加到日志。验证方法手动跑一次故意造一个 7 天前的日志文件touch -d 8 days ago /var/log/app/test.log看是否被删。再dd if/dev/zero of/tmp/big bs1M count2000造大文件看df告警是否触发。最后kill -9一个测试进程并rm它的日志看lsof L1能否抓到。我自己的习惯是每接手一台新服务器先跑一遍df -h、free -h、ss -tulnp、systemctl --failed把基线记下来之后任何异常都有对照。命令本身不难难的是知道在什么场景下按什么顺序敲以及敲完怎么看结果。这套巡检脚本我用了三年帮我提前发现过两次磁盘写满和一次僵尸进程堆积希望帮到你。本文还有配套的精品资源点击获取
返回列表