☰
Linux常规操作与指令:从基础用法到组合排查
2026/10/9 3:10:29 网站建设 项目流程

每天打开终端,我敲的第一批命令永远是固定的那几条:df -h扫一眼磁盘水位,uptime确认负载,再git status看看昨天留下的活儿干到哪了。这些指令闭着眼都能打出来,属于典型的常规操作和指令——高频、基础、风险低,但覆盖面极广。可我发现一个有意思的现象:很多人能熟练敲出十几条常用命令,却说不清每条命令背后在做什么、选项之间有什么区别、什么场景下该换哪种写法。真到排查问题的时候,就容易卡在"命令会打,但不会组合"的尴尬位置。

这篇东西没有高深的内容,就是把我在日常开发和服务器运维里反复使用的那些常规操作和指令整理成了一套自己的用法和习惯。适合刚入行的新人当成一份"每日必敲清单"来对照,也适合有几年经验但习惯零散记忆的朋友,看看有没有可以互相补充的顺手技巧。

1. 先聊聊我理解的"常规操作和指令"

1.1 常规不等于简单

很多人一听到"常规"两个字,就觉得是入门级的东西,不值得花时间。我恰好持相反观点。常规操作和指令的定义应该是:你在日常工作中使用频率最高、出错后影响面大、并且能组合出复杂能力的那些基础动作。它们可能语法很简单,但组合起来就是排查问题的完整链路。

举个最直白的例子,ls够常规了吧?但ls -l输出的每一列代表什么,ls -lt和ls -ltr的区别是什么,ls -d */能用来做什么,这些细节不是每个人都答得上来。常规操作的价值恰恰体现在这些细节里——真正干活的时候,你是不可能停下来查手册再继续的,手指比脑子快才是常态。

1.2 我把常规操作分成三个层次

第一层是"会打"。知道有cd、cp、mv、rm这些命令,能凑合着完成简单操作。这一层的人通常依赖方向键和猜,效率低且容易踩坑。

第二层是"知道选项"。明白cp -a和cp -r的区别,知道rm要加-i才安全,清楚grep -E可以用扩展正则。到了这一层,日常工作基本够用了。

第三层是"组合成套路"。比如排查磁盘问题时,我不会只敲一条df -h,而是会接着用du -sh /*定位大目录,用find /data -type f -size +500M找出具体的大文件,再用lsof | grep deleted排查有没有删了但没释放的句柄。这一套下来,问题基本就能定位了。

这篇文章主要想帮你走到第三层。每一组指令我都会给出"日常用法 + 容易忽略的细节 + 我自己踩过的坑",你可以直接拿去对照自己的工作场景。

1.3 为什么值得专门整理一遍

我的体会是:线上事故往往不是复杂的架构问题引起的,恰恰是最基础的常规操作失误——误删了文件、权限配错导致服务起不来、日志里明明有报错却定位不到位置。把常规操作练成肌肉记忆,等于给日常工作的基础打了一层底。真正的高手不是会什么冷门黑科技,而是把常规指令用到了"下意识就能组合出正确套路"的程度。

2. 文件与目录操作:每天最频繁的一批指令

2.1 增删改查的顺手写法

文件操作是所有常规操作里占比最高的部分,我先从最常用的几个指令说起。

  • ls -l我基本不用裸ls,原因很简单:没有权限、属主、大小、时间的列表等于没看。输出里的第一列是文件类型,-是普通文件,d是目录,l是软链接,这一眼就能判断当前目录下有什么类型的东西。
  • cp -a和cp -r的区别值得多说一句。-a是归档模式,等于-dR --preserve=all,会保留权限、属主、时间戳和软链接属性;-r只是递归复制。日常备份、迁移目录的时候,我默认用cp -a,否则复制出来的文件属主和时间戳全变了,后面排查问题时会多出很多干扰信息。
  • mv有一个隐藏坑:跨文件系统移动文件时,mv实际上是"复制 + 删除",不是简单的改个名字。如果目标路径在另一个挂载点,mv大目录会非常慢,而且中途失败还可能留下半成品。判断方式很简单,先df -h 源路径 目标路径看是否在同一文件系统,不在的话建议直接rsync。
  • rm是所有人最该谨慎对待的命令。我的习惯是:凡是要删东西,先ls -l或find确认路径,再执行删除;能用rm -i就用rm -i,让系统再问你一次;批量删除前面加echo预览结果,确认无误后再真正执行。比如find /tmp -type f -name "*.log" -exec rm {} \;这种,我每次都会先跑一遍不带-exec的版本,把结果列出来看清楚再动手。

提示:生产环境里我还会额外做一件事,把rm做一个别名指向rm -i。别觉得多余,我见过太多次"手滑多按了一个空格"造成的悲剧了。

2.2 权限管理:最容易忽略的常规操作

权限问题是新人最容易忽略、线上却经常出事的领域。最常见的场景是部署服务后发现"没有权限"或者"无法写入日志",这时候你需要的是chmod和chown的组合操作。

日常写法里,我倾向于用符号模式而不是数字模式。chmod u+x script.sh比chmod 755 script.sh更直观,因为你明确知道自己在给"属主"加"执行"权限。而数字模式适合一次性明确设置完整权限,比如chmod 640表示属主可读写、属组可读、其他人无权限。两者不冲突,但你要清楚自己到底在改哪一项。

chown的坑在于-R递归。chown -R appuser:appgroup /data/app会把整个目录树下所有文件的属主都改掉,这在部署时很常见,但要注意符号链接的处理——chown默认会修改链接指向的目标,而不是链接本身。如果只想改链接,需要加-h。我在初始化新环境时通常会写一段固定的初始化命令,把属主、权限、目录结构一次性配好,省得后面一个个排查。

2.3 查找与定位:find 的常规用法

find是定位文件最核心的指令,它和ls、grep组合起来能解决绝大多数"文件去哪了"的问题。

  • 按名字找:find /data -type f -name "*.log"。注意-name是精确匹配文件名,-iname忽略大小写。
  • 按时间找:find /data -type f -mtime +7表示修改时间在 7 天前的文件,-mtime -1表示 1 天内修改过的。排查"哪个文件刚被动过"时这个参数特别好用。
  • 按大小找:find / -type f -size +1G。磁盘告警时的主力命令,先按大小筛出大文件,再决定是清理还是迁移。
  • 执行操作:find ... -exec rm {} \;或者find ... -exec ls -lh {} \;。这里有个细节,{}会被替换成每个找到的文件路径,\;表示命令结束。如果换成-exec ... {} +,则会把结果打包成尽量少的批次执行,性能更好,但有些命令不支持这种写法。

我在组合find和xargs时特别注意一个坑:文件名包含空格的情况。find /data -type f -print0 | xargs -0 grep "keyword"是安全的写法,-print0用空字符分隔,xargs -0按空字符解析,这样任何文件名都不会被拆错。直接用默认的xargs遇到带空格的文件名,结果会非常诡异。

3. 系统状态与进程管理:常规检查清单

3.1 资源查看的组合用法

排查系统问题,我有一套固定的开场动作,叫做"三查":

  • uptime:看负载。输出的最后三个数字分别代表 1、5、15 分钟的平均负载。如果 1 分钟负载远高于 15 分钟负载,说明系统正在经历突发压力;如果三个数字都高,说明问题持续有一段时间了。
  • free -h:看内存。重点不是 Available 那个数字,而是理解 buff/cache 的作用。Linux 会把空闲内存拿来当缓存,所以"内存不够"不代表系统真的不够用,要看 Available 是否充足。如果 Available 持续走低、同时 Swap 开始被使用,那才是真正需要关注的时候。
  • df -h:看磁盘。这里有个容易踩的坑——df -h显示的是文件系统的容量,但很多场景下 inode 先被耗尽了。所以磁盘相关的常规检查我会顺手加一条df -i,看 inode 使用率。我遇到过几次这样的情况:df -h明明还剩 30%,服务却报"no space left on device",最后查出来都是 inode 耗尽了。

这三条命令单独看都很简单,但它们组合起来能快速给出系统状态的完整画像。我的习惯是把它们写成一行固定命令:

uptime && free -h && df -h && df -i

每次怀疑系统出问题时先跑一遍,基本能把方向定下来。

3.2 进程管理:信号的理解比 kill 本身更重要

ps和kill是进程管理的常规指令,但很多人对信号的理解是模糊的。

ps aux和ps -ef输出格式略有差异,我习惯用ps aux,因为 CPU 和内存占用率直接显示在第三和第四列,方便一眼看出谁在吃资源。查某个具体进程时会用pgrep或ps aux | grep <名称>(注意 grep 本身也会匹配到,一般我会再加一个grep -v grep或者直接pgrep -f)。

kill的核心是信号。实际工作中最常用的三个信号:

  • SIGTERM(kill <pid>):默认信号,让进程优雅退出。进程可以捕获这个信号做清理工作,比如关闭连接、保存状态。日常关闭服务应该优先用这个。
  • SIGKILL(kill -9 <pid>):强制杀死,进程没有机会做任何清理。这是最后手段,不是常规手段。滥用-9可能导致数据丢失或者留下脏状态。我见过有人一杀进程就-9,结果服务重启后因为之前的锁文件没清理而直接起不来。
  • SIGHUP(kill -1 <pid>):很多守护进程把收到这个信号当作"重新加载配置"的指令。比如nginx -s reload本质上就是发送相关信号让 worker 平滑重启。改完配置文件想不中断服务地生效,优先找它对应的 reload 方式,而不是 kill 再重启。

我的习惯是:先pgrep -f <完整命令行关键字>确认 PID,再ps -p <pid> -o pid,ppid,cmd确认没杀错人,最后才执行kill。这套三连在批量操作时尤其重要。

3.3 日志查看的固定套路

日志排查是"常规操作"里最需要套路的部分。我的固定流程是"三段式":

第一段,先定位时间范围。journalctl --since "1 hour ago"或者journalctl -u myservice --since "2024-01-01 10:00" --until "2024-01-01 11:00"把窗口框住。直接从头翻整个日志文件是最低效的做法。

第二段,按关键字过滤。grep -i "error"或者journalctl -u myservice | grep -i "exception"。如果日志量特别大,我会用grep -A 20把报错后面的上下文一起打出来,因为真正的根因往往藏在报错前的几行而不是报错本身。

第三段,用tail -f跟进实时输出。改动配置后重启服务,tail -f /var/log/app/app.log能看到启动过程有没有新的报错。

提示:这里分享一个我自己的小技巧。排查问题时的每一条命令我都会把时间戳带上,比如date +%s记录发现问题的时间点,再用journalctl --since精准定位。别高估自己的记忆力,事后复盘时你会发现时间线才是排查问题的第一线索。

4. 文本处理三件套:grep、sed、awk 的常规用法

4.1 grep:从筛选到上下文分析

grep是文本处理里使用频率最高的指令,它解决的问题只有一个:从一堆文本里找出我关心的内容。但常规用法里有几个细节值得注意。

  • -E启用扩展正则,这样可以用|做多条件匹配。比如grep -E "ERROR|FATAL" app.log一次过滤出两种级别。
  • -v反向匹配,排除不需要的内容。比如grep -v "^#" config.conf可以快速去掉注释行。
  • -r递归搜索目录。grep -r "keyword" /data/logs/比逐个文件搜高效得多,但要注意加--include="*.log"限定文件类型,否则会把二进制文件也扫一遍。
  • -l只输出文件名。当你只想知道"哪个文件里出现了这个关键字"时,加-l能省掉大量刷屏输出。
  • -A/-B输出匹配行的下文/上文。grep -B 5 -A 10 "Exception" app.log是我看 Java 报错时最长用的组合。

我自己的另一个习惯是给grep加上别名alias grep='grep --color=auto',让匹配到的内容带颜色高亮。这个习惯很小,但效率提升非常明显,尤其在日志刷屏的时候,一眼就能定位到关键字的位置。

4.2 sed:流式编辑的常规操作

sed被人记住往往靠一条命令:sed -i 's/old/new/g' file。确实,全局替换是它最常规的使用场景。但除了替换,我还会用到这几个:

  • 删除空行:sed -i '/^$/d' file。清理配置文件格式时很实用。
  • 按行号打印:sed -n '20,30p' file。想快速看文件的某一段时比cat再数行数方便得多。
  • 按范围删除:sed -i '/^#/d' file。去掉所有以#开头的注释行。

-i参数有个隐藏风险:它直接修改原文件,没有备份。我的做法是任何时候都写成sed -i.bak 's/old/new/g' file,这样file.bak就是修改前的原始文件。为什么强调这个?因为我真的见过有人批量替换配置文件后,因为正则写错导致全文件被改废、又没有备份,最后只能从版本控制里恢复的惨状。多敲一个.bak,成本几乎为零,收益是随时能反悔。

4.3 awk:分列统计的威力

awk看起来最难,其实常规操作就三件事:按列取数据、按条件过滤、做统计。

按列取数据是最常用的。awk '{print $1, $NF}'里的$1是第一列,$NF是最后一列,NF是当前行的字段数量。这个语法理解之后,很多场景会变得很简单。比如ls -l的输出里,文件大小是第五列,文件名是最后一列,想列出当前目录下所有文件大小大于 100M 的文件,可以这样写:

ls -l | awk '$5 > 104857600 {print $9}'

按条件过滤配合指定分隔符是第二个常用场景。日志文件一般用空格或者逗号分隔,awk -F',' '{print $2}'可以指定逗号作为分隔符。比如处理 CSV 格式的导出数据,一列一列拆出来非常顺手。

第三个是统计。去重统计最简单的方式是awk '{print $1}' file | sort | uniq -c | sort -rn。这条管线的逻辑是:取出第一列 → 排序(uniq要求相邻才去重,必须先sort)→ 统计出现次数 → 按次数倒序排列。比如统计 nginx 访问日志里每个 IP 的请求次数,10 秒就能出结果。

awk的统计能力更强,比如对某一列求和:awk '{sum += $5} END {print sum}'。虽然这个例子很简单,但当你面对几千行的日志时,这种"按列直接算"的写法比写脚本快太多了。

5. 网络指令:排查问题时的固定顺序

5.1 连通性检查:从 ping 开始判断

网络排查是我日常工作中比较容易慌的领域,因为涉及的因素太多。但常规的检查顺序是固定的,第一步永远是ping。

ping -c 4 <目标地址>的-c参数指定发包数量,不加-c的话它会一直ping下去,在自动化脚本里是个隐患。判断标准很简单:

  • 能 ping 通:网络链路通,问题大概率在更高层(端口、服务、域名解析)。
  • 不能 ping 通:可能是网络不通、防火墙拦截,或者目标主机确实不在线。这时候不要慌,继续往下排查域名解析和路由。

ping还有一个容易忽略的信息:TTL 值。不同操作系统的默认 TTL 不一样,比如 Linux 很多是 64,Windows 是 128。如果你 ping 一个主机发现 TTL 是 118 左右,通常说明目标主机是 Windows(128 减去中间的跳数)。减少的数值大致就是中间经过的路由跳数,这在判断"为什么延迟高"时能提供线索。

5.2 端口与服务:ss 和 curl 的配合

ping通了不代表服务可用,下一步要确认端口是否在监听、服务是否能正常响应。

查看端口监听状态,我用ss -tlnp:

  • -t只看 TCP,
  • -l只看监听状态的端口,
  • -n不做域名解析(速度快,输出更干净),
  • -p显示占用端口的进程信息。

确认某个具体端口时:ss -tlnp | grep :8080。如果没有任何输出,说明端口没在监听,或者服务绑定到了别的端口。

端口监听正常后,紧接着用curl验证 HTTP 服务是否真的能响应。curl -I http://localhost:8080/health能快速拿到响应头,判断状态码是否 200;curl -v会输出详细的请求和响应过程,包括 DNS 解析、TCP 连接、TLS 握手每一步,定位"卡在哪一步"非常好用。

提示:检查本机服务时,很多人习惯用netstat,但新版系统里ss是更推荐的指令,输出更快、信息更全。我的建议是尽早切换到ss,别等netstat彻底淘汰了再适应。

5.3 域名解析:别让 DNS 问题消耗你的时间

域名解析是网络排查里最容易被忽视的环节。遇到"访问不了、但 IP 能通"的情况,优先怀疑 DNS。

nslookup <域名>或者dig <域名>都能查解析结果。dig的输出更详细,dig +short直接给出解析后的 IP 列表,是我日常最常用的写法。

还有一个细节:解析顺序由/etc/resolv.conf决定,如果第一个 DNS 服务器响应慢,整体解析就会变慢。排查"域名解析耗时过长"时,可以用time dig +short <域名>来量化解析耗时,然后对比换一个 DNS 服务器(比如改成公共 DNS 或者内网自建的 DNS)之后的差异。

很多服务起不来的问题根源是配置里写了域名,但容器或服务器上解析不了。所以我的常规建议是:能用 IP 做内网通信的地方尽量用 IP,用域名的地方务必确认dig能正常解析,这两条做好了,能避开一半的网络连接问题。

6. 把常规操作练成肌肉记忆的几个习惯

6.1 别名与快捷键:让高频操作变成一键

常规操作的效率提升,我做得最多的一件事是配置别名。每个人工作场景不同,别名的内容也不同,但下面几个是我觉得通用性很高的:

alias ll='ls -l' alias la='ls -la' alias grep='grep --color=auto' alias df='df -h' alias free='free -h' alias rm='rm -i'

配置写进~/.bashrc或者~/.zshrc后执行source ~/.bashrc即可生效。这些别名没有改变命令本身的能力,只是把最容易踩坑的默认行为做了修正——比如rm加-i、df和free自动用人性化单位。它们是安全的,也是我推荐所有人最先配置的一批。

6.2 历史命令:你敲过的每条命令都是资产

终端的历史记录不是给你按上下键翻着玩的,它是一个可以检索的操作日志。

默认的history会列出最近执行的命令,配合Ctrl+R做反向搜索,输入几个关键字就能找到之前敲过的长命令。比如你上周写过一条特别复杂的find+xargs组合,现在想复用,Ctrl+R输入xargs就能找回来。

我更进一步的做法是在~/.bashrc里加上这两行:

export HISTTIMEFORMAT="%F %T " export HISTSIZE=10000

这样每条历史命令都会带上时间戳。这个习惯的价值在复盘排障过程时尤其明显——"我当时是什么时间执行了什么命令导致了这个结果",有了时间戳,整个操作的因果链条清晰很多。

6.3 我自己常犯的几个错误

最后聊几个我在实际工作中交过学费的坑,给读者提个醒。

第一个是管道命令的"半截"操作。比如ps aux | grep java之后,如果你要kill这些进程,千万不要直接kill $(ps aux | grep java)就完事。这条命令会匹配到 grep 自身,而且输出里可能包含不相关的进程。我会先看一遍输出,用pgrep -f精确定位,再逐个确认 PID。

第二个是find配合-exec时不先预览。前面提过,任何带写操作的find指令,我都强烈建议先跑一遍不带-exec的版本,把即将被操作的文件列表完整看一遍。这一条救了我很多次。

第三个是引号和转义的疏忽。grep "keyword" file里的引号看似可有可无,但当你匹配的内容里包含空格、特殊符号时,少了引号命令行为完全不一样。我的规则是:凡是关键字里可能有特殊字符,一律加引号,宁可多打两个字符,也不要让 shell 帮你"解释"关键字。

把常规操作练成肌肉记忆,不是让你死记硬背命令参数,而是建立一个本能反应:看到现象,立刻想到对应的指令组合。我在实际使用中最深的体会是,常规操作的价值不在于单条命令多酷,而在于它们组合起来能形成一套不假思索的排查链路——从磁盘到进程,从网络到日志,每一环都有一两条固定的指令在等着,出了问题照着链路走,大概率能定位到根因。

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

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

立即咨询