☰
Linux常用命令速查手册:运维排障与终端操作实战指南
2026/10/7 11:59:17 网站建设 项目流程

简介:这份资源面向需要频繁使用 Linux 终端的操作员、技术支持工程师以及希望掌握终端技能的学习者,系统梳理了日常运维与开发中高频使用的 Shell 命令及其用途,帮助读者在遇到具体操作问题时快速定位合适命令,提升终端操作效率。压缩包内共 1 个 docx 文档,约 18KB,内容按文件与目录操作、系统状态与进程管理、文件内容查看与编辑、权限与所属关系调整、压缩解压、网络配置与连通性测试等模块组织,并附有常用快捷键与重定向、管道、通配符等符号指令的语法说明。文档以命令加用途对照的形式呈现,涵盖 cd、pwd、touch、cp、mv、rm、ps、kill、df、free、ifconfig、ping、grep、find、chmod、chown、tar、gzip 等典型指令,便于按场景查阅与速记。目前已有 320 人学习,适合作为终端操作的随身速查手册,也可为编写复杂 shell 脚本打下基础。

1. 从一次凌晨三点的排障说起:这份命令清单到底值不值得存

上周凌晨三点,一台跑着业务程序的服务器磁盘告警,我远程连上去,第一反应不是翻监控面板,而是敲了三条命令:df -h看哪个分区满了,du -sh *定位到具体目录,ps -ef确认没有异常进程在疯狂写日志。前后不到两分钟,问题定位完毕。这套动作我做了快十年,靠的不是什么高深技巧,就是一份烂熟于心的 Linux 常用命令清单。

这份《Linux系统常用命令与操作详解》整理的正是这类东西——文件与目录操作、进程管理、文本查看、权限修改、压缩解压、网络排查,外加一批终端快捷键和重定向、管道符号的用法。它不涉及内核源码,也不讲 systemd 底层原理,就是一份面向日常运维和终端操作的速查手册。适合谁?每天要 SSH 登机器干活的运维、后端、测试,以及刚接触 Linux、想摆脱图形界面依赖的学习者。说白了,它解决的是「知道要干什么,但命令记不全、参数拿不准」这个高频痛点。

2. 文件与目录操作:从 cd 到 find 的完整链路

2.1 目录导航与创建:pwd、cd、mkdir 的配合逻辑

很多人觉得cd和pwd太基础,不值得单独讲。但我在带新人的时候发现,恰恰是这两个命令的组合使用,能暴露一个人对「当前工作目录」这个概念的理解程度。pwd显示的是你此刻站在文件系统的哪个位置,cd则是移动。问题在于,脚本里如果依赖相对路径,一旦cd失败,后续所有操作都会在错误目录下执行,这种翻车现场我见过不止一次。

常见做法是:在脚本开头先cd /target/dir || exit 1,确保目录切换成功再往下走。mkdir创建目录时,-p参数是必须记住的——mkdir -p dir1/dir2/会递归创建多级目录,如果 dir1 已存在也不会报错。不加-p的话,父目录不存在就直接失败。

# 确认当前位置,切换到目标目录,失败则退出 pwd cd /home/project || exit 1 # 递归创建多级目录,已存在时不报错 mkdir -p /data/logs/app1/2024 # 创建空文件用于占位或后续写入 touch /data/logs/app1/2024/.keep

逻辑说明:|| exit 1是短路写法,cd返回非零时立即终止脚本,避免在错误目录下继续执行。mkdir -p的-p是 parents 的缩写,同时具备「已存在不报错」的语义。touch创建空文件,常用于占位或触发某些依赖文件存在的逻辑。

参数怎么改:mkdir加-m 755可以在创建时直接指定权限,省去后续chmod。touch加-t 202401011200.00可以指定时间戳,调试按时间轮转的日志清理脚本时会用到。

2.2 复制、移动与删除:cp、mv、rm 的边界条件

cp和mv看起来简单,但有几个边界条件不踩一次记不住。cp 1.txt 2.txt是复制文件,cp -r dir1/ dir2/是递归复制目录。注意-r对目录是必须的,对文件加了也不报错但没意义。mv既是移动也是重命名,mv dir1 dir2如果 dir2 不存在,就是把 dir1 改名成 dir2;如果 dir2 是已存在的目录,就是把 dir1 移进去。这个歧义是很多脚本 bug 的源头。

rm -rf的杀伤力不用多说,我自己的习惯是:执行前先用ls确认路径,或者用rm -ri交互式删除。-f强制、-r递归,两个合在一起就是「不问、不提示、连目录带文件全删」。

# 复制文件,目标存在则覆盖 cp /etc/nginx/nginx.conf /etc/nginx/nginx.conf.bak # 递归复制目录,保留权限和时间戳 cp -a /data/app /backup/app_$(date +%Y%m%d) # 移动并重命名,目标目录不存在时相当于改名 mv /tmp/upload.tar.gz /data/releases/app-v2.tar.gz # 删除前先确认,交互式递归删除 rm -ri /data/tmp/old_cache

逻辑说明:cp -a等价于-dR --preserve=all,归档模式,保留符号链接、权限、时间戳,备份场景首选。$(date +%Y%m%d)是命令替换,生成日期后缀,避免覆盖历史备份。rm -ri的-i会在每个删除动作前询问,适合不确定路径是否干净时使用。

参数怎么改:cp -u只复制源比目标新的文件,做增量备份时有用。mv -n禁止覆盖已存在文件,防止误操作。rm没有回收站,删之前用ls或find确认是血泪经验。

2.3 查找与统计:find、wc、du 的组合用法

find / -name 1.txt是全盘查找,但实际生产中很少这么干,因为太慢。常见做法是限定目录深度和类型:find /data -maxdepth 3 -name "*.log" -type f。-maxdepth控制递归层数,-type f只找文件,-type d只找目录。找到之后通常要配合-exec做后续操作,比如批量删除七天前的日志。

wc统计文本的行数、字数、字符数,-l行数、-w字数、-m字符数。注意-m和-c的区别:-c统计字节数,-m统计字符数,含中文时两者结果不同。du -sh *显示当前目录下每个子项的总大小,-s汇总、-h人类可读。排查磁盘满的时候,du -sh * | sort -rh | head -10能快速定位大目录。

# 在指定目录下查找七天前的日志文件并删除 find /data/logs -maxdepth 2 -name "*.log" -mtime +7 -type f -exec rm -f {} \; # 统计文件行数、字数、字符数 wc -l access.log wc -w access.log wc -m access.log # 查看当前目录各子项大小,按降序排列取前十 du -sh * | sort -rh | head -10

逻辑说明:-mtime +7表示修改时间在七天前,-exec ... \;对每个匹配结果执行命令,{}是占位符。sort -rh中-r降序、-h按人类可读单位排序。du -sh *的*是通配符,匹配当前目录所有非隐藏项。

参数怎么改:find的-mtime改成-mmin可按分钟筛选。du加--exclude排除指定目录。wc不加参数时依次输出行、字、字符数。

3. 进程与系统状态:top、ps、kill 的实战判断

3.1 进程查看:ps -ef 与 top 的分工

ps -ef和top是两套不同的观察视角。ps -ef是快照,全格式显示所有进程,适合配合grep过滤特定进程。top是动态刷新,默认按 CPU 占用排序,适合实时观察资源消耗。我一般先用ps -ef | grep java确认进程是否存在,再用top -p pid盯住这个进程的资源曲线。

ps -ef输出里几个关键列:UID 是启动用户,PID 是进程号,PPID 是父进程号,CMD 是启动命令。排查「谁启动了这个进程」时,顺着 PPID 往上找就行。top里重点看%CPU、%MEM、RES(常驻内存)和S(进程状态,R 运行、S 睡眠、Z 僵尸)。

# 全格式显示所有进程,过滤目标进程 ps -ef | grep nginx # 显示所有用户的所有进程,按 CPU 降序 ps aux --sort=-%cpu | head -20 # 动态监控指定进程,每 2 秒刷新 top -p $(pgrep -d, -f "java.*app.jar")

逻辑说明:ps aux是 BSD 风格,ps -ef是 System V 风格,输出列略有差异但核心信息一致。--sort=-%cpu按 CPU 降序排列。pgrep -d,把多个 PID 用逗号连接,传给top -p同时监控多个进程。

参数怎么改:top交互模式下按M按内存排序、按P按 CPU 排序、按1展开每个核心。ps -eo pid,ppid,cmd,%mem,%cpu自定义输出列。

3.2 进程终止:kill -9 与 kill -15 的选择

kill -9 pid是强制杀死,进程没有机会清理现场。kill -15 pid(默认)是发送 SIGTERM,进程可以捕获这个信号做优雅退出。我见过太多人上来就-9,结果数据库连接没释放、临时文件没清理、事务回滚不完整。正确顺序是:先kill -15,等几秒,如果进程还在再kill -9。

kill -9杀不掉的进程通常处于 D 状态(不可中断睡眠),一般是等 IO。这种情况-9也没用,得先解决 IO 问题。僵尸进程(Z 状态)是子进程已死但父进程没回收,kill杀不掉,得找父进程处理。

# 先发 SIGTERM,给进程优雅退出的机会 kill -15 $(pgrep -f "app.jar") # 等待 5 秒,检查是否还在 sleep 5 if pgrep -f "app.jar" > /dev/null; then kill -9 $(pgrep -f "app.jar") fi

逻辑说明:pgrep -f按完整命令行匹配进程。sleep 5给进程留出清理时间。if pgrep ... > /dev/null判断进程是否仍存在,存在则强制杀死。

参数怎么改:kill -l列出所有信号。kill -0 pid不发送信号,只检查进程是否存在。pkill -f按模式批量杀进程,慎用。

3.3 系统资源:free、df、ifconfig 的读数

free看内存和交换空间,重点看available列而不是free列,因为buff/cache可回收。df -h看磁盘分区使用率,-h人类可读。ifconfig看网卡配置,虽然新系统推荐ip addr,但ifconfig在多数环境仍然可用。

free -h输出里available是估算的可用内存,比free更准确。df -h如果某个分区到 100%,先du -sh定位大目录,再决定清理还是扩容。ifconfig主要看inet地址和RX/TX流量计数。

# 人类可读格式查看内存 free -h # 查看磁盘分区使用率 df -h # 查看网卡配置和流量 ifconfig eth0

逻辑说明:free -h的-h自动换算单位。df -h的Use%列超过 80% 就该关注。ifconfig eth0指定网卡,不加参数显示所有。

参数怎么改:free -s 2每 2 秒刷新。df -i看 inode 使用率,inode 满了也会导致无法创建文件。ifconfig在部分新系统需安装 net-tools。

4. 文本查看与权限管理:cat、tail、chmod 的细节

4.1 文本查看:cat、more、less、head、tail 的适用场景

cat适合小文件,一次性输出全部内容。more和less分页显示,less支持上下翻页和搜索,比more好用。head -20看开头 20 行,tail -20看结尾 20 行。tail -f是实时滚动,看日志必备。

cat 1.txt | grep 'hello'是管道组合,把 cat 的输出作为 grep 的输入。但更高效的写法是grep 'hello' 1.txt,省去一次管道。tail -f配合grep可以实时过滤日志:tail -f app.log | grep ERROR。

# 查看文件开头 20 行 head -20 1.txt # 查看文件结尾 20 行 tail -20 1.txt # 实时滚动查看日志,过滤 ERROR 行 tail -f app.log | grep --line-buffered ERROR # 分页查看大文件,支持搜索 less /var/log/syslog

逻辑说明:head -20和tail -20的-20是行数简写,等价于-n 20。--line-buffered让 grep 逐行输出,避免管道缓冲导致日志延迟。less中按/搜索、q退出。

参数怎么改:tail -f -n 100从最后 100 行开始滚动。head -c 1024按字节数查看。less +F进入类似 tail -f 的模式,按 Ctrl+C 退出。

4.2 权限修改:chmod 的符号模式与数字模式

chmod u+r 1.txt是符号模式,u当前用户、g同组、o其他、a所有,+添加、-移除、=设置。r可读、w可写、x可执行。chmod -R u+r dir1递归修改目录及子目录。

数字模式更常用:chmod 755表示所有者读写执行、组和其他读执行。chmod 644表示所有者读写、组和其他只读。-R递归时要注意,目录需要x权限才能进入,所以目录通常设755,文件设644。

# 符号模式:给所有者添加执行权限 chmod u+x script.sh # 数字模式:所有者读写执行,组和其他读执行 chmod 755 /data/app/bin/start.sh # 递归修改目录权限,目录 755 文件 644 find /data/www -type d -exec chmod 755 {} \; find /data/www -type f -exec chmod 644 {} \;

逻辑说明:find -type d只匹配目录,-type f只匹配文件,分别设置权限避免一刀切。-exec ... \;对每个结果执行 chmod。

参数怎么改:chmod -R递归但可能误伤,建议用 find 精确控制。chmod +X(大写)只给目录和已有执行权限的文件加 x。

4.3 归属与链接:chown、ln 的硬链接与符号链接

chown user1:group1 1.txt修改文件所属用户和组。chown -R user1:group1 dir1递归修改。ln 1.txt 1_bak.txt创建硬链接,两个文件名指向同一 inode,删掉一个另一个还在。ln -s 1.txt 1_bak.txt创建符号链接,类似快捷方式,源文件删了链接就失效。

硬链接不能跨文件系统,不能链接目录。符号链接可以跨文件系统,可以链接目录。生产环境用符号链接更多,比如ln -s /data/releases/app-v2 /data/app/current,切换版本时只改链接指向。

# 修改文件所属用户和组 chown user1:group1 1.txt # 递归修改目录下所有文件及子目录 chown -R user1:group1 /data/app # 创建符号链接,指向实际版本目录 ln -s /data/releases/app-v2 /data/app/current # 查看链接指向 ls -l /data/app/current

逻辑说明:chown user:group冒号分隔用户和组。ln -s创建符号链接,ls -l显示->指向。硬链接用ln不加-s。

参数怎么改:chown -h修改符号链接本身的归属而非目标。ln -sf强制覆盖已存在的链接。chown --reference=file1 file2以 file1 为模板修改 file2。

5. 避坑与排查:那些年我踩过的命令坑

5.1 rm -rf 路径拼接翻车

现象:脚本里rm -rf $DIR/*,变量$DIR为空时变成rm -rf /*,系统文件被删。 原因:变量未定义或赋值失败,通配符展开到根目录。 解决:脚本开头set -u让未定义变量报错,删除前判断[ -n "$DIR" ] && rm -rf "$DIR"/*,变量加引号防止空格分词。

5.2 tail -f 管道 grep 无输出

现象:tail -f app.log | grep ERROR明明有 ERROR 日志,终端却不显示。 原因:grep 默认缓冲输出,管道中数据攒够一块才刷。 解决:加--line-buffered参数,tail -f app.log | grep --line-buffered ERROR。或者用stdbuf -oL grep ERROR。

5.3 chmod -R 777 的权限灾难

现象:为了省事chmod -R 777 /data,结果 SSH 密钥被其他用户读取,安全审计不过。 原因:777 让所有用户可读写执行,包括敏感文件。 解决:目录 755、文件 644,用 find 分别设置。SSH 目录.ssh设 700,密钥文件设 600。

5.4 kill -9 导致数据不一致

现象:数据库进程kill -9后重启,事务日志回滚,部分数据丢失。 原因:-9 不给进程清理机会,未落盘的数据丢失。 解决:先kill -15,等待进程自行退出。数据库类进程尤其要避免 -9,除非完全无响应。

5.5 df 和 du 结果不一致

现象:df -h显示磁盘满,du -sh *加起来却远小于分区大小。 原因:被删除的文件仍被进程持有句柄,空间未释放。 解决:lsof | grep deleted找到持有句柄的进程,重启该进程释放空间。或者> /proc/pid/fd/fd_num清空。

6. 进阶技巧:用 history、管道和重定向串起工作流

history配合ctrl + r是命令行的后悔药。ctrl + r进入反向搜索,输入关键词就能调出历史命令。我习惯用history | grep ssh找之前连过的机器,比翻笔记快。history -c清空当前会话历史,但不会清.bash_history文件。

重定向和管道是组合命令的基础。>覆盖、>>追加、2>错误输出、&>全部输出。echo "haha" > 1.txt把输出写入文件,echo "lala" >> 1.txt追加。cat 1.txt | grep 'hello'管道把前一个命令的输出作为后一个的输入。

# 搜索历史命令中的 ssh 连接 history | grep ssh # 将标准输出和错误输出都追加到日志 ./run.sh >> /var/log/app.log 2>&1 # 用管道统计当前目录文件数 ls -1 | wc -l # 查找并统计匹配行数 grep -c "ERROR" app.log

逻辑说明:2>&1把文件描述符 2(错误)重定向到 1(标准输出),&>>是追加模式的简写。ls -1每行一个文件名,wc -l统计行数。grep -c直接输出匹配行数,比grep | wc -l少一次管道。

参数怎么改:history -w立即写入历史文件。exec > file 2>&1把整个脚本的输出重定向。tee命令同时输出到屏幕和文件:command | tee output.log。

压缩解压这块,tar -zcvf 1.tar.gz 1.txt打包并 gzip 压缩,tar -zxvf 1.tar.gz解压。gzip 1.txt压缩单文件,gzip -d 1.txt.gz解压。tar的-z是 gzip、-j是 bzip2、-J是 xz。我一般用tar -zcvf打包,-C指定解压目录:tar -zxvf 1.tar.gz -C /target/dir。

快捷键方面,ctrl + c停止当前进程、ctrl + l清屏、ctrl + q退出、tab自动补全。ctrl + a跳到行首、ctrl + e跳到行尾、ctrl + u删除到行首、ctrl + k删除到行尾。这些组合键在敲长命令时能省不少时间。

从那以后我每次写删除脚本,都强制走一遍「变量判空 + 路径确认 + 先 ls 后 rm」的流程,宁可多敲几行也不赌运气。这份命令清单我建议存一份在本地,遇到具体操作问题时直接搜,比临时查网页快得多。希望帮到你。

本文还有配套的精品资源,点击获取

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询