ARTICLE DETAIL

资讯详情

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

Linux基本管理及命令(上):从命令行到实战排障

Linux基本管理及命令(上):从命令行到实战排障 说实话搜索“linux常用命令”的人大部分并不缺一份命令列表缺的是把这些命令串联起来的管理思路。我带过的实习生里凡是能稳定处理线上故障的无一例外都是把基础命令练成了肌肉记忆反过来那些整天在收藏夹里囤“命令大全”的人真遇到服务挂了第一反应不是去看日志而是先翻书。所以我写这篇《Linux的基本管理及命令上》不打算做成字典式罗列而是把日常管理里最高频的几条线挑出来一条一条讲清楚其中的逻辑文件目录、文本过滤、用户权限、进程负载、网络排查、操作效率。每条都配上能直接抄的用法也把“为什么这么用”说明白。适合刚转行做运维的新人、把 Linux 当主力开发环境的程序员以及正在准备相关工作面试的朋友。这篇先打地基。存储管理、systemd 服务、定时任务、Shell 脚本这些进阶内容我计划放在“下”篇里继续这一篇先把最常用、也最容易出错的部分啃透。1. 学命令前先建地图管理Linux其实就抓三条线1.1 “命令大全”治不了手忙脚乱问题意识才行我见过不少人拿着命令手册背ls 有哪些参数、cp 有哪些选项背得滚瓜烂熟可真给一台出问题的机器照样不知道先看哪里。问题出在哪出在把命令当成了孤立招式没搞懂管理一台 Linux 本质上是在回答几类问题文件放在了哪里、文件内容是什么、谁在占资源、资源够不够用、网络通不通。带着“我现在要解决什么问题”去找命令比按字母表刷命令有效得多。很多基础的 linux 面试题绕来绕去也逃不开这几类问题。只要在脑子里有一张地图清楚“这类问题归哪条线管、用哪几个命令”面试和实战都不会慌。比如搜索“linux常用命令”的与其逐条背不如按自己的角色反向梳理一遍我是开发者要查日志我是运维要管权限我是 DBA 要看负载——角色不同命令的优先级完全不同。1.2 文件线、进程线、网络线排障时记得反复横跳我把基础管理命令粗略分成三条线对应三类最常见的操作目标文件线定位文件pwd、cd、ls、find读写内容cat、less、tail、grep、sed、awk控制归属和权限chown、chmod、umask。进程线看进程状态ps、top、看资源占用free、kill、pkill必要时结合存储状态一起判断。网络线测连通ping、测端口telnet、nc、看监听状态ss、netstat、发起请求验证curl。为什么要分线因为真实排障几乎永远是跨线的。你发现网站打不开文件线帮你看日志有没有报错网络线帮你确认端口有没有监听进程线帮你看服务进程是不是已经退出。三个方向来回跳才是真实工作节奏。所以别单个记命令要按“问题场景”成组记比如“日志排错三件套tail、grep、less”这就是一组。接下来逐个展开。2. 文件与目录操作把路径逻辑和常用参数一次吃透2.1 绝对路径、相对路径与点号目录先搞懂你在哪文件线是所有命令的地基第一个要搞明白的就是“你在哪”。Linux 路径有两种写法绝对路径从根/开始比如/etc/nginx/nginx.conf相对路径从当前目录开始比如cd ../conf。新手最常见的问题是分不清.和..。这里一个点.代表当前目录两个点..代表上级目录波浪号~是当前用户的家目录还有一个容易被忽略的短横线-它表示“上一次所在的目录”。cd -我几乎天天用。刚在/var/log看完日志又要回/etc改配置一个cd -直接切回上一步的位置比重新敲一长串路径快得多。另外一个小习惯路径永远用 Tab 补全不要一个字一个字敲这不仅是提速还能避免打错目录名导致命令跑错位置。路径搞清楚了后面所有文件操作的根基才稳。2.2 ls、cp、mv、rm高频参数与翻车防护ls不是只有裸用这一种姿势。日常我最常用的组合ls -l显示详细信息。第一列-rw-r--r--依次是文件类型加权限后面跟着硬链接数、属主、属组、大小、修改时间、文件名。ls -lhh让大小显示为人类易读的 K、M、G否则一个目录翻下来全是字节数眼睛会瞎。ls -lt按修改时间倒序排列找刚改过的文件特别好用。ls -a显示隐藏文件排查问题时经常有惊喜或者惊吓。cp和mv的坑主要在目录上。复制目录必须加-r递归更稳的是-a它会在递归基础上保留权限、属主、时间戳等所有属性我个人的习惯是“复制目录默认用 cp -a”。mv则要理解一个底层机制同一文件系统内的移动只是改写目录项秒级完成跨文件系统的移动本质是“复制加删除”大目录会明显变慢心里要有数别以为是机器卡了。rm是操作失误的重灾区。有人搜“linux删除文件夹命令”答案其实就是rm -rf 目录名但这条命令越简单越危险。我的经验是三层防护第一层能不用rm就不用先用mv把目标挪到/tmp过渡第二层删除前先pwd确认自己在哪再ls确认要删的是不是那个目标尤其写脚本时千万不要用相对路径拼rm -rf第三层给rm设置alias rm -i让系统每次删除前问一句对新手是保命措施。.2.3 find 定位文件别再一层层 ls 翻目录经常会遇到这种场景我知道三天前某个日志被轮转过但忘了放在哪个子目录。这时候用ls一层层翻是纯体力活正确姿势是findfind /var/log -name *.log # 按名字找 find /home -type f -mtime 30 # 找30天前修改过的文件 find /etc -type f -name *.conf -exec grep -l server_name {} \;find的三要素是起点路径、条件表达式、动作。起点别给太宽比如直接全盘扫会很慢条件里-name按名称、-type f指普通文件、-type d指目录、-mtime N表示 N 天前改过动作最常见的是默认的-print和-exec。-exec后面跟要执行的命令和{}最后用\;结尾格式有点丑但“找到之后顺手处理”的需求只有它能满足。我一般建议把-exec rm这种高危动作换成先-name列出结果看一遍确认无误再删。宁可多敲一次也不要批量误杀。3. 看日志筛文本tail、grep、sed、awk 怎么配合3.1 日志排错三板斧tail -f、grep -C、less日志是 Linux 排障里最有价值的信息源没有之一。第一板斧是实时跟踪tail -f /var/log/nginx/error.log会持续输出新增日志行适合一边复现问题一边观察服务打印的信息。反过来tail -n 100看最后 100 行比直接cat一个几百 MB 的日志强得多这是日志文件名堆成山的时代必须养成的习惯。第二板斧是过滤grep的常用姿势grep -i error app.log忽略大小写因为日志里可能是 Error、ERROR 混着写。grep -C 5 关键字 app.log把命中前后各 5 行一起显示排错时上下文比单一行重要得多。grep -v ^# 配置文件排除注释行只看有效配置。看 nginx、redis 配置时超好用。grep -rn xx /etcr递归子目录n显示行号。改配置前先全局搜一遍哪些文件涉及某个参数。第三板斧是less。很多人不明白为什么有cat还需要less因为文件长。less打开大文件是按需加载不会一次性读进内存而且支持上下翻页、按/输入关键字搜索、按n跳下一个匹配、按g和G跳到开头和结尾。我现在看任何超过一屏的文件习惯性用less而不是cat。3.2 sed 的流式编辑改文件之前先想想如果说grep是“找”sed就是“改”。sed按行读入、处理、输出所以叫流编辑器。最常用的两种场景sed -n 20,30p 配置文件 # 只显示第20到30行 sed -i s/127.0.0.1/0.0.0.0/g 配置文件 # 全局替换监听地址第二个命令里s是替换g是全局不加g的话一行里只替换第一个匹配。这里有一个高频翻车点sed -i是直接改原文件改完没有后悔药。我自己的习惯是涉及生产配置批量替换时先去掉了-i跑一遍看输出结果对不对确认无误再加-i正式执行或者用sed -i.bak让 sed 自动生成一个.bak备份文件。这两个习惯能让你少掉不少头发。3.3 awk 按列切数据统计排序一条龙awk的入门可以只记一句话默认按空格或 Tab 把每一行拆成列$1是第一列$2是第二列$NF是最后一列。比如统计访问日志里每个 IP 的请求次数awk {print $1} access.log | sort | uniq -c | sort -rn这句执行后第一列通常是客户端 IP被提取出来sort排序让相同 IP 相邻uniq -c去重并计数最后的sort -rn按次数倒序。排在最上面的就是访问量最大的 IP是热点请求还是异常刷量一眼就能看出来。awk -F:可以指定分隔符比如处理/etc/passwd这种冒号分隔的文件awk -F: {print $1} /etc/passwd把每个用户名列出来。到这里我把grep、sed、awk的分工总结成一张表方便按需选择工具核心能力典型场景grep按行筛选文本日志过滤 error、排除配置注释行sed按行编辑文本批量替换、打印指定行区间awk按列处理文本提取字段、统计计数、日志分析4. 用户、组与权限多用户系统的安全底线4.1 用户和组的增删改usermod 的 -aG 千万别省Linux 是多用户系统建用户、分权限是基本功。创建用户的标准动作useradd -m -s /bin/bash zhangsan passwd zhangsan-m表示同时创建家目录/home/zhangsan-s指定登录 shell。不加-m的话用户连家目录都没有登录后执行cd ~都会奇怪地失败。然后是passwd设置密码。查看用户信息用id zhangsan能看到 uid、gid 和所属组。改用户最常踩的坑在usermod -G和-aG的区别上。-G是直接设置附加组列表会把用户原本的附加组全部覆盖掉-aG才是“追加”到现有附加组。我见过有人想把用户加进 docker 组用了usermod -G docker结果用户之前所在的多个附加组全没了权限瞬间收缩服务也跟着起不来。所以我给自己定的规矩是凡是涉及附加组的修改默认写-aG少打一个 a 就是事故。删除用户用userdel -rr表示连同家目录、邮件池一起清理。组管理相对简单groupadd创建groupdel删除组名记录在/etc/group文件里。日常维护中组不会天天动但用户和权限的搭配关系一定要清楚。4.2 权限位与 umask644、755 不是随便选的权限位必须看懂。ls -l第一列-rwxr-xr-x拆开看第一位是文件类型-普通文件、d目录、l软链接后面九个字符分三组分别是属主、属组、其他人。每组rwxr读、w写、x执行。注意目录的x不是“执行”而是“能否进入这个目录”很多人一开始想不通这一点导致权限配置各种摸不着头脑。九位权限可以用数字简写r4、w2、x1加起来就是一组权限。比如7rwx、6rw-、5r-x、4r--。于是常见的755就是属主完全权限、属组可读可执行、其他人可读可执行644是属主可读写、其他人只读。配置文件一般644脚本和可执行文件755密钥私钥这类敏感文件600。别小看这套数字口诀日常所有权限调整都是围绕它展开。修改权限用chmod两种写法都常用chmod 755 文件或chmod ux 文件给属主加执行权限。修改属主属组用chown 用户名:组名 文件递归修改目录要加-R同样要小心别把权限一股脑改过头。还有一个容易被忽略的umask。它决定新建文件的默认权限文件默认是666减去 umask目录默认是777减去 umask。系统一般默认022所以新建文件是644、目录是755。如果某台机器 umask 被改成077那么新建文件只有属主能看协作时其他人读不了。遇到“我明明创建了文件同事怎么看不到”这类问题记得回来查 umask。4.3 sudo 提权为什么不用 root 干日常活很多新手拿到 root 密码就全程 root爽是爽坏处也明显一是没有审计谁在什么时候干了什么全凭记忆二是手滑代价太大root 下一条rm -rf连确认的机会都没有。正确做法是平时用普通用户需要管理员权限时用sudo执行单条命令。sudo 的配置文件在/etc/sudoers修改必须用visudo命令打开它会在保存时做语法检查防止你写坏后 sudo 全线失效。常见配置思路是让“管理员组”的用户都能 sudo在 sudoers 里加入%wheel ALL(ALL) ALL一行然后把需要授权的用户加进 wheel 组。sudo 执行时日志会记录在/var/log/secure或/var/log/auth.log里出问题可以追溯。这里强调一个原则sudo 是“最小授权”不是“见谁给谁”。有人为了省事给某普通用户配了NOPASSWD: ALL等于给了一个永不过期的 root后患无穷。我的建议是能单条命令授权就单条授权能按组管就按组管别图省事。5. 进程与系统负载ps、top、kill 管住程序的运行状态5.1 ps -ef 和 ps aux搞清你看到的是什么进程管理第一步是看有哪些进程在跑。ps -ef和ps aux都能看信息量差不多区别主要在输出格式ps -ef是标准语法包含USER PID PPID C STIME TTY TIME CMD多一个 PPID父进程 PID排查“谁启动了谁”很关键ps aux是 BSD 风格包含USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND多了 CPU 和内存占用百分比。我的习惯是快速扫描系统里有没有可疑进程用ps aux配合排序要看进程父子关系用ps -ef。实战里最常用的是管道组合ps -ef | grep 服务名直接查某个服务的进程号和父进程号。注意grep自身也会出现在结果里如果你看到一条grep --colorauto xxx的记录别惊讶那是刚才那条命令自己。top则是动态刷新版的 ps。进入 top 后按P按 CPU 排序按M按内存排序按1展开每个 CPU 核按q退出。看内存不用进 top用free -h更直观重点看 available 这一列别只盯着 free 那一行——Linux 会把空闲内存拿去做缓存free 显示的数值很小不代表内存不够available 才是真正可用的量。5.2 load average 和 free -h别被数字吓到top 第一行有个load average: 0.10, 0.15, 0.08。这三个数分别是 1 分钟、5 分钟、15 分钟的平均负载反映的是“处于可运行状态和不可中断睡眠状态的进程数量”的滑动平均。很多人一听“负载”就以为是 CPU 占用率其实是两码事。负载高不高要结合 CPU 核数和等待队列的性质一起看。8 核机器 load average 是 8说明每个核平均排一个任务未必过载CPU 占用率 100% 且 load 持续上涨才是真饱和。反过来load 高但 CPU 占用不高很可能是进程阻塞在磁盘 IO 或锁等待上这时候应该去看iostat、strace而不是继续盯着 top。这个判断经验比背命令参数值钱得多。内存方面free -h看物理内存使用。当 available 明显偏低而 cache 很高常见诱因是有进程吃了大量内存做缓存比如某些 Java 或数据库进程。先用ps aux --sort-%mem找出内存占用前几名的进程再决定是调参还是扩容别一上来就物理删文件。5.3 kill 的礼貌与底线先 SIGTERM 再 SIGKILLkill的默认信号是 SIGTERM编号 15相当于给进程递一份“请择机退出”的通知进程收到后可以做清理、保存状态这是体面的退出方式。kill -9发送的是 SIGKILL强制杀死进程没有机会做任何善后可能留下临时文件、未写盘的缓冲数据。所以我的原则是默认kill PID给它几秒到几十秒的善后时间确认已经无响应、非杀不可时再用kill -9。几个实用变体pkill按进程名杀比如pkill -f python app.py会匹配命令行里包含该字符串的进程比记 PID 省事但也正因为匹配范围大写-f参数时要格外确认别误伤同名进程。kill -1HUP则常用来让进程重新加载配置而不退出比如改完 nginx.confnginx -s reload内部就是这么实现的。信号编号行为使用场景SIGTERM15请求进程退出默认首选给进程善后机会SIGHUP1挂断/重载配置通知守护进程重新读取配置SIGKILL9强制杀死进程无响应时的最后手段6. 网络排查从分层开始ping、telnet、ss、curl 的用法6.1 先判断问题在第几层再决定用哪个命令网络问题最怕盲目乱试。我习惯按层次定位第一层判断“通不通”第二层判断“端口通不通”第三层判断“服务返回什么”第四层判断“域名解析对不对”。对应关系大概是ping负责判断目标主机是否可达telnet或nc负责判断某个 TCP 端口能否建立连接curl负责向 HTTP/HTTPS 服务发真实请求看响应nslookup负责确认域名解析结果。这套组合拳不是随便排的。假设访问一个网站超时先 ping 同一个 IP如果不通问题大概率在链路或目标主机的网络配置没必要先折腾应用层如果 ping 通但 curl 失败就把目光转向端口是否监听、防火墙是否放行、服务进程是否存活。每一步都在缩小范围这就是排查效率的来源。6.2 telnet 看端口通不通以及没装 telnet 时的备选很多人搜“telnet ip 端口 命令怎么看通不通”答案其实很简单telnet 目标IP 端口例如telnet 192.168.1.10 3306。如果端口可达界面会进入一个空白的连接会话或者显示 Connected to 之类的回显如果不可达一般很快报Connection refused对方拒绝或connect timed out超时多半是被防火墙丢弃。连接成功后按Ctrl]进入命令模式再输入quit即可退出。不过要知道现代系统默认不装 telnet 客户端因为 telnet 协议是明文传输不适合传数据但作为“端口连通性测试工具”它依然非常轻量。如果机器上没有 telnet可以用nc -vz 目标IP 端口z表示只扫描不发送数据v显示详细信息。我自己一般看手头机器装了哪个就用哪个功能等价。这里还有一个容易被忽视的限制telnet 只管“TCP 能不能连上”。连不上也可能是目标服务只监听在内网地址、或者只监听 IPv6需要配合下一小节的ss去查监听地址别一上来就断定“服务没起”。6.3 看本机端口监听和 HTTP 状态ss 与 curl 组合排查网络问题的第二步常常是“看这台机器上到底有哪些服务在监听”。老命令netstat -tlnp还能用但新系统我更推荐ss -tlnpt表示 TCPl表示只显示监听n显示数字端口和 IPp显示进程名和 PID。一个典型输出会告诉你哪个 IP 地址上、哪个端口、由哪个进程占用。比如:::80表示 IPv6 任意地址监听127.0.0.1:8080则表示服务只对本机开放外部根本连不进来。这个细节我见过不少人栽过。对外发起请求验证用curl。curl -I http://服务地址只看响应头-v显示完整握手过程对排查 HTTP 状态码、重定向、证书问题都很直观。域名解析不对时先nslookup 域名或nslookup 域名 指定DNS服务器看返回的 IP 是不是预期值。这套“ss 查监听 curl 验请求 nslookup 查解析”的组合基本覆盖了日常网络服务排查的完整链路。7. 让操作提速的日常细节history、补全与 vim 基础7.1 history 不只是翻旧账还能帮你少敲一半命令history的价值被低估了。基础用法是history列出历史命令配合grep快速查找history | grep nginx能找出之前敲过的所有 nginx 相关命令。但高效玩法是这几个!!重新执行上一条命令。尤其忘加sudo的时候敲sudo !!瞬间补救。!$引用上一条命令的最后一个参数。比如刚cat /etc/nginx/nginx.conf接着想vim编辑它直接vim !$。CtrlR进入反向搜索历史模式输入几个关键字就能模糊匹配之前敲过的长命令继续按CtrlR往前翻。这是命令行效率提升最大的一个习惯没有之一。我自己的体验是熟练用CtrlR之后很多记不全的长参数命令根本不需要重新记忆历史记录里都有搜出来改一改就能用。7.2 Tab 补全与行内快捷键手指不离键盘Tab 补全是最被低估的效率工具。敲cd /e然后按 Tab系统自动补全成/etc/再按一次 Tab有时会列出该目录下的候选列表。对写不准的目录名、长文件名Tab 补全基本杜绝了拼写错误。命令补全同样适用想不起某工具完整名时敲前几个字母加 Tab就能看到候选命令。行内编辑快捷键同样能省大量时间CtrlA跳到行首、CtrlE跳到行尾、CtrlU删除光标前所有内容、CtrlK删除光标后所有内容、CtrlW删除前一个单词。这些组合键在修改长命令时极为顺手不用去按方向键一格一格挪。可以刻意练几天形成肌肉记忆后整个操作速度会上一个台阶。7.3 vim 最少必要操作撑起绝大多数场景vim 劝退了不少人其实日常用到的就是“最少必要操作”。先理解模式打开文件默认在普通模式按i进入插入模式开始打字编辑完按Esc回到普通模式按:wq保存退出按:q!不保存强制退出。普通模式下还有一组高频操作dd删除当前行yy复制当前行p粘贴u撤销/加关键字搜索n跳下一个匹配gg跳到文件头G跳到文件尾。这十来个操作基本覆盖了在服务器上改配置文件的全部场景。有人问编辑器那么多为什么偏要学 vim。因为在干净的生产服务器上你最可能面对的就是 vim而且很多管理命令本身绑定了它的操作习惯比如visudo打开的就是 vim 风格的编辑界面。不用刻意学成高手能看文件、能改配置、能搜关键词、能撤销就足够支撑日常管理了。我在实际工作中最深的体会是编辑器只是工具真正值钱的是你操作命令时脑子里那张清晰的管理地图。先把这篇里的基础命令练熟你会发现很多“高深问题”其实并不复杂复杂只是因为底层逻辑还没串起来。
返回列表