简介:这份资源是面向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块设备,ssocket,p管道。
创建和删除要分清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 u+x给属主加执行。目录的执行位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。特殊权限位:SUID(4,执行时以属主身份)、SGID(2,目录下新建文件继承属组)、Sticky(1,只有属主能删自己文件,如/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发信号,默认-15(SIGTERM)让进程优雅退出,-9(SIGKILL)强制杀。我一般先-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按名字查 PID,pkill按名字杀。killall类似但更老。注意-9会让进程没机会写日志、释放锁、清理临时文件,数据库进程尤其慎用,可能触发恢复流程。
3.3 内存、磁盘、负载:free、df、du、iostat
free -h看内存,重点看available而不是free,因为 buff/cache 可回收。df -h看分区使用率,du -sh *看当前目录各子项大小。磁盘 IO 用iostat -x 1,看%util和await。
# 内存,每秒刷新 free -h -s 1 # 找 / 下最大的 10 个目录 du -xh / --max-depth=1 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看网卡和 IP,ip 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-size=500M清理到 500M。systemctl list-units --failed看所有失败单元。
4.3 防火墙与 SELinux:两个最容易忽略的拦路虎
firewalld用firewall-cmd,ufw用ufw,iptables直接操作规则。国产 Linux 常见firewalld。
# 看当前区域和开放端口 firewall-cmd --list-all # 永久开放 8080/tcp firewall-cmd --permanent --add-port=8080/tcp firewall-cmd --reload # ufw 看状态和开放 ufw status verbose ufw allow 8080/tcp # 临时关闭 SELinux 排查 getenforce setenforce 0 # 永久改配置文件 /etc/selinux/config 的 SELINUX=permissiveSELinux 的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 LANG=zh_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 THRESHOLD=85 LOG_DIR="/var/log/app" KEEP_DAYS=7 # 1. 检查各分区使用率 df -hP | awk -v t="$THRESHOLD" 'NR>1 && $5+0>=t {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 'NR>1 {print $1, $2, $7}' | sort -k3 -rh | head -5 # 4. 检查 failed 服务 systemctl list-units --failed --no-legend # 5. 输出内存和负载 free -h | awk 'NR==2 {print "Mem used: "$3"/"$2}' uptime | awk -F'load average:' '{print "Load:"$2}'set -euo pipefail让脚本遇错退出、未定义变量报错、管道任一环节失败即失败。df -hP的-P保证一行一个分区,方便awk解析。$5+0把百分比字符串转数字比较。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 2>&1,每天凌晨 3 点跑,输出追加到日志。
验证方法:手动跑一次,故意造一个 7 天前的日志文件touch -d "8 days ago" /var/log/app/test.log,看是否被删。再dd if=/dev/zero of=/tmp/big bs=1M count=2000造大文件,看df告警是否触发。最后kill -9一个测试进程并rm它的日志,看lsof +L1能否抓到。
我自己的习惯是每接手一台新服务器,先跑一遍df -h、free -h、ss -tulnp、systemctl --failed,把基线记下来,之后任何异常都有对照。命令本身不难,难的是知道在什么场景下按什么顺序敲,以及敲完怎么看结果。这套巡检脚本我用了三年,帮我提前发现过两次磁盘写满和一次僵尸进程堆积,希望帮到你。
本文还有配套的精品资源,点击获取