ARTICLE DETAIL

资讯详情

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

Linux指令实战指南:从文件操作到Docker部署的高频命令详解

Linux指令实战指南:从文件操作到Docker部署的高频命令详解 半夜两点被线上告警电话叫醒打开笔记本登上服务器脑子里还在宕机手上却要飞快敲出一条条Linux指令排查问题。这种场景干过运维或者经常跟服务器打交道的人应该都不陌生。你可能不是科班出身也没系统学过Linux指令但只要你碰过云服务器、搞过部署、跑过脚本就一定会发现真正让你在关键时刻不慌的往往不是鼠标点来点去的面板而是那些看起来又短又枯燥的命令。这篇文章不打算给你列一份所谓的“Linux指令大全”然后撒手不管而是想从一个实际干活的人的角度把这些年高频使用、容易踩坑、以及面试和工作中反复出现的Linux指令拆开聊透。内容覆盖文件操作、权限管理、进程排查、网络诊断、自动化脚本再到Docker、Git、开发环境安装等进阶场景适合刚入行的运维、正在学Linux的学生以及所有想系统补一补命令行基本功的后端开发。你会看到每条指令的适用场景、典型用法、参数选择的原因还有我在真实环境里踩过的坑。1. 先建立指令地图学Linux指令前必须想清楚的事1.1 指令和图形界面到底差在哪很多新手一开始会问既然有宝塔面板、有桌面环境为什么还要用命令行这个问题的答案其实也是理解Linux指令价值的起点。图形界面是把常用操作包装成按钮好处是上手快坏处是每个操作都要打开对应页面几步才能完成更关键的是一旦服务器没有桌面环境、身边只有SSH终端面板一挂或者端口冲突你就彻底抓瞎了。命令行不一样它把操作抽象成一条条指令输入输出都是文本组合起来能力极强。同样查一个进程占用端口图形界面可能要开好几个窗口命令行一条ss -lntp就出来了还能直接配合grep、awk做二次处理。另一个容易被忽视的点是可编程性。图形界面里你做的事很难被记录下来指令却可以完整写进脚本里。我之前帮朋友处理一台被挖矿程序入侵的服务器就是靠定时任务列表、进程、网络连接这些指令的输出比对异常IP和进程路径一步步把问题定位出来的。这个过程没法用鼠标完成因为你要在几分钟内验证上百个关联信息。可以说命令行不仅是一个操作入口更是一种把“临时操作”变成“标准流程”的底层能力。1.2 给指令分个类学习路线比记命令更重要我见过太多人拿着一份常用命令大全从头背到尾结果背了后面忘了前面遇到真实场景还是不会用。问题不在记忆力而在于没有分类和场景化的学习框架。我的建议是把Linux指令分成五大类文件与目录处理、文本与内容处理、权限与用户管理、进程与系统资源、网络与通信。先按照这五类建立骨架再把具体命令填充进去遇到什么问题就知道该去哪个抽屉里找工具。打个比方指令体系就像一套工具箱。螺丝刀解决的是旋转问题扳手解决的是拧紧问题你不会拿一把螺丝刀干所有活。Linux也是一样删除用rm复制用cp查看内容用cat或less查找文件用find处理文本用grep和awk。如果你能把每个指令的核心用途先搞清楚再去记参数效率会高很多。就算某条命令的具体参数忘了只要知道它大概在哪个抽屉里查一下就是几秒钟的事。1.3 从高频需求反推哪些Linux指令最值得先学我在带新人和面试候选人的时候常会观察他们手忙脚乱时下意识敲什么。实际工作里高频指令其实非常集中根本不需要一次性学几百条。日常部署最常用的是cd、ls、pwd、mkdir、cp、mv、rm还有查看内容的cat、less、tail排查问题最常用的是ps、top、free、df、du、ss、ping、curl再往后做自动化就会用到grep、awk、sed、xargs、systemctl、crontab。如果你正在准备Linux面试与其背各种冷门参数不如先把这些高频指令的常用场景练熟。比如问你怎么看某个进程你要知道ps -ef和ps aux的差别问你怎么看不出错信息你要知道tail -f表示实时跟踪journalctl -u服务名能看systemd日志。这些都是在真实场景中积累出来的“直觉”比零散的知识点更有价值。我后面几个部分就按这种场景化思路来展开。2. 高频Linux指令逐个拆解文件、权限、进程、网络2.1 文件和目录操作ls、cd、cp、mv、rm的细节与常见坑文件和目录操作是最基础的但这里的坑其实不少。先说ls大家天天用可真正会用的人不多。ls -l是长格式显示能看权限、属主、大小、修改时间ls -a显示隐藏文件ls -lh把大小转成K、M、G这种人类易读格式。这三者组合起来基本能满足日常需求。我有一次排查服务器磁盘大的问题就是靠ls -lhS按大小排序先定位到几个异常的大文件再进一步用du确认目录占用情况很快就找到了被日志撑满的原因。如果你只是用ls看文件名那确实有点浪费。cp和mv看着简单但容易忽略几个危险细节。cp默认不保留源文件的属性和时间戳如果要做备份并保留这些信息要加-p参数跨文件系统复制也有差异写脚本时我会尽量用cp -a做完整保留。mv在同文件系统内只是改个指针速度很快跨分区可能会变成复制再删除如果你在移动一个大文件时发现很慢就是这个原因。rm更不用说删除是不可逆的写脚本时尽量避免裸用rm能用find加-mtime清理老日志也别让脚本直接跑rm -rf变。我的习惯是先在命令前加echo打印一遍要删的东西确认无误后再真正执行。cd、pwd、mkdir这类指令比较简单但也有些小技巧。比如mkdir -p能一次创建多级目录这在写部署脚本时很常用cd -可以快速回到上一次所在目录在几个路径之间来回切换效率很高。pwd主要用来确认当前位置偶尔在脚本里需要基于绝对路径判断时用。还有一个我常用的组合是“cd 到项目目录 执行命令”用连接意味着只有前一个指令成功才会执行后一个避免目录不存在时继续往下跑。2.2 权限体系与用户管理chmod、chown、useradd的实战姿势Linux的权限模型可以拆成三组属主、属组、其他人每组都有读r4、写w2、执行x1三种权限。chmod后面跟的数字就是这三种权限值的加总。r4、w2、x1这种设计非常精巧你不需要记一堆组合只要记住7rwx、6rw、5rx、4r再按“属主-属组-其他人”的顺序写比如chmod 755表示属主可读可写可执行其他人可读可执行。我给脚本文件设权限时最常用的就是755或700前者给普通用户也能看后者只有自己能看能执行安全性更高。还有一类坑在文件和目录权限的差别上。目录的r权限决定你能不能列出目录里的文件名x权限决定你能不能进入这个目录或访问里面的文件。所以有时候你用ls看一个目录会提示Permission denied其实是目录没有r权限你能进目录却读不了文件问题可能出在文件本身的r权限上。排查权限问题我一般先用ls -l看一遍再用id确认当前用户和所在组两相对比就能快速定位。用户管理命令中useradd是新建用户passwd设置密码usermod修改用户属性。新手容易搞混useradd和adduser在Debian系里adduser是一个更友好的交互式包装会顺便创建家目录、设置密码而useradd参数更底层创建用户后未必自动建家目录需要加-m参数。新建用户后我总会马上检查id 用户名和ls -ld /home/用户名确保家目录存在且属主正确。修改文件属主则用chown比如把某个目录递归授权给另一个用户chown -R user:group 目录这在我部署web项目时非常常用。2.3 进程与系统资源排查ps、top、free、df、du怎么看排查线上故障时进程和资源命令是最锋利的刀。ps -ef和ps aux的核心区别在于输出格式和默认字段不同ps aux会用CPU和内存百分比而且能看到完整的命令参数我习惯用ps aux --sort-%cpu来按CPU占用排序一下就能揪出谁在吃资源。查看进程后如果觉得某进程占用过高不要急着kill -9先看看它是什么程序、启动参数是什么、属于哪个用户。kill -9太粗暴可能让程序来不及释放临时文件或恢复状态我会先用kill即SIGTERM让它自己收尾没反应再升级到kill -9。配合kill -l可以查看信号列表。系统资源方面top是最经典的监控工具进去后按P按CPU排序、按M按内存排序按q退出。但top里的CPU数值包含多个维度us是用户态、sy是内核态、wa是I/O等待wa特别高通常说明磁盘读写出现了瓶颈。free -h用来查看内存重点看available而不是total因为Linux会把空闲内存拿来做缓存available才是真正可分配给新进程的内存。磁盘用df -h查看读出来的信息很直观du -sh 目录则用来统计某个目录总大小排查是哪个目录占满了磁盘时我会一层层进去执行du -sh *用数字定位最大的目录。还可以用du -sh --max-depth1 /路径一次列出第一层子目录大小省得来回跳。如果你的机器突然变卡不要只盯着CPU和内存磁盘I/O也是常客。iostat和iotop能看到读写速率虽然是两个不在同一个命令包中的工具但排查性能问题时价值很高。还有一个容易忽略的ulimit -n它显示的是当前进程能打开的最大文件数当服务报“too many open files”时多半就是它小了。临时调可以用ulimit -n 65535永久改要在limits.conf里配置这个细节在面试里出现频率也非常高。2.4 网络排查与连接检查ping、curl、ss、traceroute网络问题排在故障里最难定位。ping用来测最基本的连通性和延迟能看到丢包率但ping不通不代表服务不可达可能是对方禁了ICMP协议也可能是防火墙拦了。所以更可靠的是用端口级别的检测。ss -lntp列出当前监听中的TCP端口和对应进程几个关键参数-l表示监听-n不做反解-t只看TCP-p显示进程。这个命令比旧的netstat -lntp更高效信息量也更大如果发现端口被占用它能直接告诉你PID和进程名配合ps -p PID可以查出是哪个服务。curl是排查HTTP服务的利器。curl -I 网址只显示响应头能快速看状态码curl -v会打印详细信息curl -X POST -d ...可以模拟POST请求遇到HTTPS证书问题时还能用-k跳过验签仅限测试环境。我排查网关转发和API接口不通时几乎都是用curl来模拟请求根据返回码一步步缩小范围。默认会更详细的还有wget它更适合直接下载文件支持断点续传参数-c可以从上次中断的位置继续。如果客户端到服务器延迟很高或不通traceroute能看到路由经过的每一跳定位卡在哪个节点。需要注意traceroute在国内某些网络环境下默认使用UDP探测目标服务器可能只允许TCP或ICMP可以用-I或-T切换协议。DNS问题也很常见这时先查nslookup、dig的结果再接ping和curl判断。总结一句话先ping看通不通再ss看服务起没起再curl看协议对不对最后traceroute判断路径这套顺序能解决绝大多数网络问题。3. 把指令组合成能力管道、重定向、脚本与自动化3.1 管道与重定向为什么说一个“|”值千金单个指令能力有限但管道可以把指令串成流水线。它的原理很简单就是把前一个指令的标准输出接到后一个指令的标准输入。例如ps aux | grep nginx先从进程列表里筛出包含nginx的行。更复杂的场景是du -sh * | sort -rh | head -10一次性列出当前目录最大的十个子目录这个组合在磁盘排查时极其实用。我写这段时特意强调排序因为sort -rh是按人类可读大小反向排序不加-h会按字符串排结果就不对。重定向则把输出送往文件或设备。 表示覆盖写入 表示追加2 表示错误输出21 表示把错误输出合并进标准输出。最经典的是nohup命令 日志文件 21 这条命令在后台运行程序并把所有输出都写进日志部署项目时几乎是标配。常见的坑是有人只写了 日志忘记重定向错误结果程序报错信息直接打到终端等关了SSH窗口才发现服务起都没起来过。所以写启动脚本时我会坚持把21加上尽量保存完整日志。需要注意的是管道和重定向处理的是缓冲区数据如果你在某条命令里用tail -f这种持续输出的命令管道另一端的内容会一直滚动这在脚本里通常是不可控的。我会用tail -n 100代替tail -f去做瞬时快照避免脚本卡住。只要是写自动化、写定时任务就要时刻假设当前环境是“非交互式”的没有人在终端前停不停得下来。3.2 文本处理三剑客grep、awk、sed高频场景Linux指令里文本处理三剑客是绕不开的grep负责过滤awk负责取列和统计sed负责替换和编辑。grep的使用门槛最低grep 关键词 文件就能搜常用参数有-i忽略大小写、-r递归搜索目录、-v反选、-n显示行号。我排查日志时最常用的是grep -n ERROR 应用.log再用tail、less配合上下文定位具体异常信息。如果日志文件特别大建议先看总行数wc -l再用sed -n 1000,1020p去读指定区间避免直接cat整个文件把终端卡死。awk的本事是按列处理。默认按空格分隔$1是第一列$NF是最后一列用-F可以指定其他分隔符比如-F: 处理/etc/passwd。常用的统计场景是awk {print $1} access.log | sort | uniq -c | sort -rn | head -20一行命令就能统计出访问量最高的来源IP我排查CC攻击时经常用它。awk还能做条件判断和求和例如awk {sum$NF} END {print sum}这在统计日志响应字节总量时非常好用。学到后面你会发现awk几乎算得上一门迷你编程语言但日常用上其中20%的功能就很够了。sed的流编辑能力很强大最常用的是s替换命令。sed -i s/旧文本/新文本/g 文件可以直接在文件里全局替换-i会真正修改原文件。和awk不同sed处理的是行编辑适合做批量修改配置、替换IP地址这类工作。我遇到批量修改服务器配置文件时会先不加-i看一眼输出确认替换结果正确后再加-i落盘这个习惯帮我避免过很多次误替换。不过sed的正则在复杂匹配时比较容易出错如果要做复杂的文本转换我更倾向于直接用Python脚本处理简单场景再用sed。3.3 编写第一个运维脚本时的注意事项当指令组合成脚本能力又是另一个量级。写脚本最常见的误区是一上来就想写“通用框架”结果一行业务逻辑都不写。我建议从最实际的需求开始比如写一个“备份数据库并清理7天前备份”的脚本。先写好#!/bin/bash然后一条条把备份指令、压缩指令、删除指令串起来。脚本开头的set -e是个好习惯它表示任何一条指令执行出错就立即退出避免失败后继续往下执行造成更严重的问题。当然有时候你会希望某条命令“即便失败了也继续”这时可以在命令后加|| true效果是忽略这个错误。脚本里要尽量减少硬编码。数据库密码、端口、路径这些信息不要直接写在代码里可以用变量定义在脚本顶部或者从外部配置文件里读取。我第一次写的脚本就把服务器IP写死在代码里结果换环境部署时改得焦头烂额从那以后凡是要重复使用的东西全用变量隔离。路径处理也很重要脚本里尽量用绝对路径或者在开头用cd $(dirname $0)切到脚本所在目录这样不管从哪个目录执行逻辑都不会乱。执行权限和调试也不容忽视。脚本写好后要chmod x script.sh然后跑bash -x script.sh能看到每条指令的展开过程把变量替换后的内容都打印出来这是排查脚本逻辑最快的方式。还有一些细节比如判断文件是否存在用-f判断目录是否存在用-d判断用户是否有权限用id -u。写多了之后你会形成一套“安全默认值”的习惯不放心就先打印不确定就先备份刚写完不急着加cron手动跑一遍通过再说。3.4 系统服务与定时任务systemctl和crontab实战现代Linux发行版基本都用systemd管理服务systemctl就是它的操作入口。systemctl status 服务名看状态systemctl start/stop/restart 服务名启停服务systemctl enable 服务名设置开机自启systemctl daemon-reload在修改unit文件后重载配置。日常排查服务失败我第一步会先systemctl status看当前状态和最近日志第二步journalctl -u 服务名 -n 100看系统日志最后再根据日志内容确定是配置错误、端口被占还是依赖没启动。这套顺序能解决大部分服务异常。定时任务方面crontab -e编辑当前用户的计划任务crontab -l查看crontab -r删除。格式是五个时间字段外加命令分钟、小时、日、月、星期。比如每天凌晨3点执行备份0 3 * * * /路径/脚本.sh。需要注意的是cron执行时的环境变量和登录终端不一样PATH可能很短所以在crontab里尽量写命令的绝对路径比如/bin/bash或/usr/bin/python3否则经常出现脚本手动能跑、定时任务却跑不起来的诡异现象。我遇到很多次这个问题最后解决方法都是把环境变量显式写在脚本头部或者在crontab开头设置PATH。定时任务还有个坑是输出。如果cron里的指令有输出系统默认会通过邮件发给当前用户但服务器上往往没装完整邮件服务结果邮件文件越堆越大。更稳妥的做法是在cron行末尾加上 /dev/null 21把输出丢弃或重定向到日志文件。运维上我一般会把脚本输出写到固定日志文件再配合logrotate做日志轮转避免磁盘被撑爆。日志轮转的具体配置在/etc/logrotate.d/下原理是定期压缩和清理旧日志这套组合在长期运行的环境中非常关键。4. 进阶工具链容器、版本控制与开发环境里的Linux指令4.1 Docker指令镜像、容器、日志的常用命令梳理现在的Linux环境下部署基本绕不开Docker。Docker指令分两层镜像层和容器层。镜像方面docker pull 拉取镜像docker images查看本地镜像列表docker rmi删除镜像。容器方面docker run是创建并启动容器常用参数包括-d后台运行、-p端口映射、-v数据卷挂载、--name指定容器名、--restartalways自动重启。我部署Web应用时最常用的启动命令大概是docker run -d --name myapp -p 8080:80 -v /data:/app/data myimage:v1。这条命令会后台启动容器把宿主机的8080端口映射到容器80端口并挂载数据目录保证容器删掉后数据不丢。容器运行起来后docker ps查看正在运行的容器docker ps -a查看所有容器docker logs -f 容器名跟踪日志docker exec -it 容器名 /bin/bash进入容器内部。在容器里排查问题时我会先看日志再进去看进程和端口因为很多基础工具容器里并不一定安装完整。还有一个特别容易踩的坑是docker rm -f强制删除容器它不会自动删除关联的匿名数据卷所以删完容器后如果发现磁盘空间没释放可能是数据卷还在可以用docker volume ls查看并用docker volume prune清理。Dockerfile里的指令也值得单独说。新手常把RUN、CMD、ENTRYPOINT搞混RUN是在构建镜像时执行的命令CMD和ENTRYPOINT是容器启动时执行的命令。区别在于CMD可以被docker run后面的命令覆盖ENTRYPOINT一般不会。我写Dockerfile时有个习惯把写法可读性和构建缓存放在一起考虑变化频繁的内容放在Dockerfile后面不变的内容放前面这样修改代码时能复用前面层级的缓存构建速度会快很多。4.2 Git指令团队协作中最高频的10条Git虽然不完全是Linux指令但在Linux服务器上操作项目Git是躲不开的。高频指令里git clone把远程仓库拉到本地git status查看工作区状态git add添加文件到暂存区git commit提交git push推送git pull拉取更新。很多初学者弄不清add和commit的关系我用一个类比add是把你挑好的菜放进购物车commit是把购物车结账生成一个快照push是把这个快照上传到远端仓库。日常开发中git add -A和git commit -m 说明是重复率最高的组合但提交说明不要只写“update”最好能说清楚改了什么以后回溯时会非常感谢自己。遇到冲突是最常见的痛。git pull时提示冲突不要慌先git status看冲突文件再打开文件搜索和标记手动保留需要的内容后重新add和commit。还有一个容易被忽略的是git stash当你在当前分支改到一半临时要切分支时git stash可以把工作区保存起来切回后再git stash pop恢复省得把半成品提交上去。另外git log --oneline --graph能直观看到提交历史树排查分支合并关系时很好用。在服务器上操作Git仓库安全问题是重点。尽量不要用root账号直接拉代码单独创建一个部署用户更稳妥权限也更可控。部署脚本里如果涉及自动拉取私有仓库优先配置SSH密钥而不是把账号密码写在命令里。git remote -v可以查看当前远程仓库地址如果地址写错git remote set-url origin 新地址可以直接修改。4.3 开发环境安装中的指令问题以CUDA、Anaconda为例开发环境的安装往往是最考验Linux指令综合能力的地方。以Ubuntu上装CUDA为例不仅要用wget下载安装包还要处理依赖、设置环境变量、验证安装结果。很多教程会在最后让你把export PATH和LD_LIBRARY_PATH写进/etc/profile但我更建议写到当前用户的~/.bashrc里避免影响系统全局配置。修改配置文件后source ~/.bashrc或新开终端才会生效验证是否成功可以执行nvcc -V和nvidia-smi一个看CUDA编译器版本一个看GPU驱动的运行状态。如果nvidia-smi能正常显示GPU信息但nvcc -V找不到说明驱动装了但CUDA Toolkit没装对多半是环境变量没生效。Anaconda的安装也有类似情况。下载完sh脚本后先bash 安装脚本装完后conda init它会修改shell配置文件。常见的坑是conda命令找不到原因通常是用户环境的bashrc没加载conda初始化代码。还有一种情况是server上没有图形界面装Anaconda时不能选择自动修改PATH需要手动执行。Python环境管理上conda create -n 环境名 python3.10创建虚拟环境conda activate激活conda deactivate退出很多新人在脚本里直接跑conda activate却失败这是因为非交互式shell没有加载conda函数要先source /opt/anaconda3/etc/profile.d/conda.sh。依赖冲突这类问题多半不是一条指令能解决的需要结合pip list、conda list和搜索记录来排查。我的原则是生产环境能用Docker尽量Docker把环境固化在镜像里如果不得不在裸机上装就尽量给每个项目创建独立虚拟环境避免不同项目依赖互相覆盖。曾有人图省事把所有包装进系统Python环境结果一次升级装挂了系统自带工具从那以后我再也不在系统环境里乱装包了。4.4 虚拟机上安装Linux系统时的常见坑很多初学者第一次接触Linux就是在虚拟机上。最常见的报错是虚拟机安装Linux时出现蓝屏或黑屏这和安全启动、虚拟化开关有关。如果是Windows主机上的VMware或VirtualBox先确认BIOS里开启了Intel VT-x或AMD-V也就是虚拟化技术其次如果安装的是较新的Linux发行版要注意虚拟机软件版本是否太旧图形加速或内核兼容性都可能出问题。我见过太多人卡在“下了镜像却装不上”的阶段最后发现只要把虚拟机设置里的“安全启动”关掉或者把虚拟化引擎勾上问题就迎刃而解。内存分配也是个重点。如果虚拟机内存给得太少系统安装界面会非常卡尤其是带图形界面的Ubuntu桌面版建议分配至少4GB内存磁盘我一般先给40GB后续不够再加容量但扩展起来比较麻烦。CentOS、Ubuntu Server这类纯命令行版本对资源要求低很多1GB内存也能跑更适合用来学习Linux指令。装好后第一件事我建议先看网卡配置ping通外网确认能用SSH远程连接。如果ping不通检查虚拟机网卡是NAT还是桥接模式NAT模式下宿主机可以上网虚拟机一般也能上网桥接模式则相当于虚拟机直接连入局域网容易被外部设备访问但也更依赖DHCP环境。还有一类坑是镜像下载不完整导致安装中途报错。下载Linux镜像时最好校验一下MD5或SHA256很多官网会提供校验文件一步校验能避免白白浪费安装时间。虚拟机里的Linux没有桌面也不用慌完全可以在宿主机上用SSH工具连进去从这时候开始你才真正进入命令行工作流。习惯了纯命令行之后再去装桌面版就会觉得鼠标点来点去反而慢。5. 常见问题与排查技巧实录我踩过的那些指令坑5.1 权限不足Permission denied怎么破“Permission denied”应该是Linux新手最早遇到的报错之一。这个提示的意思是当前用户对你操作的文件或目录没有相应权限。排查思路很简单先ls -l明确属主和权限位再看id确认当前用户最后判断当前用户是否属于文件属组。如果是root基本能绕过大多数权限限制但root也不是万能的对SELinux或AppArmor这些安全模块的拦截也只能另想办法。很多时候权限不足其实是文件或目录的属主不对用chown改成正确用户后立刻恢复。还有一种权限问题发生在“明明有权限还是执行不了”的场景。这时要看看文件是不是没有执行权限目录是不是没有进入权限或者是因为文件系统挂载时用了noexec选项。比如在云服务器上挂载数据盘如果mount参数配置里有noexec那么在这个挂载点下的所有可执行文件都无法运行只能把分区重新挂载为exec或者把程序移到其他分区。这类问题不看挂载参数很难定位所以我遇到权限类报错常用的完整诊断序列是ls -l → id → df -hT看文件系统类型和挂载选项。5.2 指令找不到command not found的原因和应对“command not found”也极其常见。原因可能是命令没安装也可能是命令存在但不在当前用户的PATH环境变量里。刚接触Linux时我总以为所有命令都自带后来才明白很多指令需要单独安装比如ifconfig在较新系统里默认就没有需要用ip命令或者先安装net-tools。判断一个命令到底装没装可以用which 命令名或command -v 命令名能找到路径说明在PATH里找不到也不一定没装可能只是路径没加进去。另一种情况是命令明明装了但sudo执行和普通用户执行结果不一样。这通常也是PATH的差别sudo默认安全策略会重置PATH导致普通用户能用、sudo却提示command not found。解决方法是sudo visudo里设置secure_path或者直接用命令的绝对路径执行。在脚本里出现command not found我第一反应是检查脚本开头的shebang以及是否存在变量写错如果脚本开头第一行不是#!/bin/bash系统默认用别的shell解释可能出现语法兼容问题所以固定写清楚shebang是很重要的习惯。5.3 误删文件后的应急思路误删是每个运维都怕又都躲不开的事。一旦发现rm删错了第一原则是立刻停止对磁盘的一切写操作业务能停就停不能停也要想办法挂载只读或者备份镜像。因为删除文件只是把inode链接断掉数据块还在磁盘上继续写操作会覆盖数据块之后再怎么恢复都是徒劳。如果误删的是进程正在使用的文件比如日志文件被删但进程没重启Linux里这个文件的空间不会释放因为它仍被进程持有但看着文件不存在了。此时可以用lsof | grep deleted找到持有者从/proc/PID/fd/路径恢复文件。恢复文件的工具有很多比如debugfs、extundelete不过它们能恢复的成功率和文件系统类型、文件大小、磁盘使用情况都有关系。要是数据太重要更可靠的办法是数据盘快照和异地备份这比事后恢复要可靠得多。所以我现在养成的习惯是rm前先ls甚至先echo打印完整路径能不用rm就不直接裸删脚本里尽量把删除操作设计成移动到/tmp或某个回收目录定期清理。这些习惯看起来简单但真的能在关键时刻救你一命。5.4 指令太多记不住我的记忆方法和速查表最后再聊聊记不住这件事。我不建议背指令大全也不建议记一长串参数。我的方法是“按场景记忆”每次遇到一个问题尽量在终端里完成解决并记录下来。比如今天发现磁盘满了就用df、du、find的组合把问题解决那么这套命令你就记住了而且记得很牢。过几天遇到同样问题如果忘了再查一次第三次基本就不会忘了。人的记忆靠重复但重复的方式最好是真实场景刺激而不是单纯去背。我还会给自己准备一个速查表不过不是把命令抄一遍而是按“问题描述→解决命令→关键参数”的格式维护。比如“查端口占用ss -lntp”下面备注“-t指TCP-p显示进程”。“查看日志尾部tail -f 文件”备注“-f是实时跟踪CtrlC退出”。这个速查表既是我的笔记也是我教新人时的教材。只要你坚持用这种方式积累三个月后的Linux指令水平一定远超每天背命令大全的人。如果一定要给新手划重点我建议优先掌握这组高频流程文件创建修改用mkdir、touch、vi查看与搜索用ls、cat、less、grep、find权限用chmod、chown、useradd进程资源用ps、top、free、df、du网络用ping、curl、ss日志排查用tail、grep、journalctl自动化用crontab、systemctl容器部署用docker ps、docker logs、docker exec。这些命令之间的组合才是真正让你从“会敲命令”变成“会解决问题”的关键。
返回列表