ARTICLE DETAIL

资讯详情

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

Linux常用命令核心解析:文件权限、进程排查与日志定位

Linux常用命令核心解析:文件权限、进程排查与日志定位 简介《Linux系统常用命令与操作详解》是一份面向Linux终端操作员、技术支持工程师及初学者的命令速查手册。内容按文件与目录管理、系统状态监控、进程控制、网络配置、权限修改、文本处理与压缩解压等场景归类覆盖cd、ps、kill、chmod、tar、grep等高频命令及典型参数组合。文档为docx格式压缩包共1个文件大小约18KB内容精炼、便于随身查阅。文中还特别补充了重定向、管道、通配符以及ctrlc、tab补全等符号与快捷键用法有助于理解shell工作方式并提升脚本编写与排错能力。目前已有319人学习使用适合日常遇到具体操作问题时快速定位合适命令也可作为系统学习Linux终端技能的入门参考。1. Linux系统常用命令的核心矛盾不是背不完而是用不对搜“Linux常用命令大全”的工程师有相当一部分下载过一份按字母排序的命令表真正登录服务器排查问题时却往往从 ls 开始逐个试。这个标题表面上看是命令清单实际要解决的是“定位、执行、验证”的操作链路文件在哪、权限怎么改、进程是否异常、日志说明什么。命令本身并不难背难的是把每一条输出变成下一步动作的依据。下面不再按字母序罗列而是按排查主线的顺序把 Linux 系统中出现频率最高的六十条常用命令重新过一遍。适合刚接触 Linux 的开发者也适合准备运维面试的技术人已经熟练的人重新审视边界条件和参数陷阱同样能减少线上环境的误操作。2. 文件与目录Linux常用命令里最先要建立肌肉记忆的一组2.1 从 ls -l 的输出反推整条权限链路文件报错时第一眼永远看 ls -l。执行下面的命令ls -l /etc/hostname # -rw-r--r-- 1 root root 32 Sep 14 09:21 /etc/hostname输出里第一段字符决定文件类型与权限。第一个字符-表示普通文件d表示目录l表示软链接b和c分别对应块设备和字符设备后面的九个字符每三位一组依次是属主、属组、其他人的读、写、执行权限。数值32是文件字节数不是行数这一点对新手极具迷惑性。把一行的六列拆开念一遍之后再遇到 Permission denied就能立刻判断是属主不对、属组不对还是缺少执行位。除了基本展示ls还有一些容易被忽略的参数。ls -lt在目录中按修改时间排序发布版本出现问题时可以快速找到刚刚被改动的文件ls -a显示.开头的隐藏文件排查环境变量加载问题时不至于把.bashrc和.profile漏掉。写脚本时则建议使用ls -1加管道配合 wc -l 统计文件数量避免交互式终端的装饰性输出干扰统计结果。2.2 cd、cp、mv、rm 的最小参数组合这四条命令本身没有门槛真正的临界点在一些混合参数上。下面这组是排查和部署中最高频的几种命令参数组合场景说明cp -a复制目录并保留属主、权限、时间戳迁移配置目录避免二次 chowncp -u仅覆盖源目录中更新的文件增量同步静态资源mv -n不覆盖已存在的同名文件合并多批文件时保护已有内容rm -i删除前逐一确认使用通配符删除一批文件时兜底rm -rf递归强制删除只应出现在明确限定的目录范围内实际使用时要区分cp -a与cp -r。-r只做递归复制新文件的属主和权限跟随当前执行用户重新生成-a相当于-dR --preserveall会把原文件的属主、属组、权限、时间戳一并保留。直接把编译好的站点目录复制到另一台机器时用-a可以省掉后续整页的 chmod 修复。mv在同一文件系统内只是改写目录项不复制数据所以能瞬间完成一旦跨文件系统移动实际复制内容后删除源文件命令的耗时和 IO 消耗都会明显上涨这也是判断数据是否跑在挂载点上的一个旁证。2.3 用 find 把“文件在哪”变成一条可执行的清理任务查找明确名称的文件find比locate更可控因为它可以按时间、大小、类型组合过滤再用-delete或-exec直接接管后续动作。下面的命令用于清理 30 天前的日志find /var/log -type f -name *.log -mtime 30 -delete参数展开来说-type f排除目录和软链接避免误删目录导致路径结构变化-name *.log使用单引号防止 Shell 先行展开通配符-mtime 30表示文件内容最后修改时间距今超过 30 天无符号的30表示恰好位于第 30 天的边界容易漏掉或误伤-delete只在前面所有条件同时满足时执行删除。正式清理前把-delete改成-ls先跑一遍配合 crontab 落盘输出能避免批量删错再把备份拉回来的尴尬。日志文件找不到名字时先按最近修改时间过滤find /app/tomcat/logs -type f -mmin -60 -printf %TY-%Tm-%Td %TH:%TM %p\n-mmin -60查找 60 分钟内被修改过的文件-printf允许自定义输出格式先打印修改时间再打印完整路径文件多时排序和过滤都更方便。磁盘打满场景下再补一个-size 500M可以快速锁定超过 500MB 的临时文件避免对文件系统做无差别全盘扫描。2.4 tar 打包与解压中的乱码问题在编码不在命令“Linux 解压文件乱码”是搜索量相当高的一类问题。同一台机器上zip 包偶尔解出一堆乱码而 tar.gz 很少出现同类现象。原因不是命令用错而是 Windows 压缩工具生成 zip 时普遍使用 GBK/GB18030 编码写入文件名Linux 终端默认按 UTF-8 解码两个编码不一致就显示为乱码。tar.gz 内部文件名的编码规则统一因此几乎没有这种争议。处理办法是在解压入口直接指定编码unzip -O GBK 中文文件名.zip-O参数表示用指定字符集解析文件名GBK 解出来的文件名就能正常落到磁盘里。部分发行版默认安装的 unzip 不支持-O可以改用7z x -mcp936解压效果等价。如果乱码发生在 tar.gz 包内通常需要先确认打包时是否经过某种文件名转码流程这种场景比 zip 少见得多处理优先级也可以放低。提示解压乱码不需要在解压后批量重命名指定正确的入口编码一次解决。事后用脚本替换文件名反而容易牵连正常的中文文件名。3. 权限与用户管理Linux常用命令从能用到敢用的分水岭3.1 chmod 数字位读、写、执行如何快速换算权限的数字表示是三组八进制数的叠加每一组允许的值及其含义如下表数字权限位组合含义7rwx全部权限6rw-读写不能执行5r-x读和执行不能写4r--只读0---无权限chmod 755 script.sh设置之后属主拥有全部权限属组和其他用户拥有读和执行权限。对目录而言x的意义是能否进入目录所以目录通常设置为 755如果设置成 6别人就无法 cd 进去。chmod 644 config.conf则是属主可读写、其他人只读的典型配置权限。数字看多了自然会形成条件反射一旦某个文件的权限位第一位是7就要停下来问自己这个文件真的需要被随便写吗符号方式适合调试时做单点修改。chmod x start.sh为所有身份增加执行位是最常用的叠加动作chmod -R gu /opt/service把属组权限对齐到属主权限并递归应用适合修复那些从 Windows 或 FTP 上传后权限混乱的目录。递归参数-R存在一处真正的风险对/、/etc这类根级目录执行错误权限会直接破坏系统可读性甚至让服务无法启动所以递归修改的范围越小越好。3.2 chown 调整属主与属组时顺序决定结果服务部署目录通常需要交给特定运行用户一条最典型命令是这样的chown -R deploy:deploy /opt/service参数含义-R递归修改目录内的所有文件deploy:deploy中冒号前面是属主、后面是属组。如果只写deploy:表示只改属主、保留原属组只写:deploy则只改属组。这两种写法在回收旧目录时非常实用因为服务只需要属于某个特定组或者只需要由指定用户读取就不必把原来的属组关系全部重写一遍。修改后可以用stat -c %A %u %g %n /opt/service快速查看权限位、uid、gid 和文件名避免路径过深时靠猜。遇到 Permission denied 时先执行id deploy查看用户所属组是否包含目标目录的属组再决定是用usermod -aG补组还是该用chown修改归属。正常情况下不要选择chmod 777一步到位它会让任何用户都能写、能执行日志目录和脚本目录一旦放开写入攻击面会显著增大。3.3 Linux 新建用户时最容易被忽略的三步“linux 新建用户”的关键不是输入这一行命令而是把下面三条完整地走完useradd -m -s /bin/bash deploy passwd deploy usermod -aG sudo deploy第一行参数的含义-m创建用户家目录/home/deploy-s /bin/bash指定登录 Shell避免用户创建后只能停留在默认的 nologin 状态。第二行给用户设置初始密码。第三行把用户追加进 sudo 组这里的-aG必须齐全-a表示 append漏掉它会把用户从原有附属组中整体替换出去随后出现“刚才还在 docker 组里现在权限没了”的怪现象。这三条命令做完后建议用groups deploy检查最终生效的组列表把结果写进初始配置文档。验证新建用户的登录状态有两个常用入口grep deploy /etc/passwd sudo -l -U deploy/etc/passwd中每一行的最后一个字段是登录 Shell若为/sbin/nologin说明这个用户只能跑服务不能交互登录。sudo -l -U deploy列出该用户被授予的 sudo 规则当用户反馈“我已经在 sudo 组却仍没有 sudo 权限”时用这条命令检查规则是否被某条更早的策略截断比反复让用户重试更有效。3.4 sudo 配置边界不要随意给 ALL(ALL:ALL) ALL公司服务器上常见的做法是给运维组单独开一个 sudoers 文件%ops ALL(ALL) NOPASSWD: /usr/bin/systemctl, /bin/journalctl这段规则的意思是ops 组的用户可以在所有主机上不需要密码执行 systemctl 和 journalctl其他命令照常需要密码或不被允许。NOPASSWD只适合限定到少量命令的场景。直接在 sudoers 里写ALL(ALL:ALL) ALL且配置 NOPASSWD相当于取消掉所有交互确认一次脚本误操作就可能导致服务目录被整体删除更重要的是回车确认本身是一种人为延迟批量执行清理动作时这道密码栏反而能让我停下来想清楚命令涉及的具体路径在不可逆操作前插入一道保护。脚本内部执行指定操作时推荐使用sudo -u deploy先切到目标用户再执行具体命令。这样部署脚本中不会出现多个 root 级的裸命令归属和环境变量也会和运行服务的用户保持一致定位问题的可观测性会明显好一些。4. 进程与系统资源排查运维常用命令的主战场4.1 ps -ef 与管道定位进程时最常用的组合登录服务器后的第一件事通常是确认进程还活着。最经典的组合ps -ef | grep nginx | grep -v grepps -ef列出全部进程展示 uid、pid、ppid 和启动命令第一段管道交给grep nginx过滤由于 grep 本身也会作为一条进程出现在结果里第二个管道用grep -v grep把它剔除。最终得到的行里第三列 PPID 是最关键的信息而最后一列完整命令包含启动参数便于确认进程是不是以错误的环境文件启动的。生产环境里更推荐直接使用pgrep -a nginx或ps -C nginx -o pid,stat,cmd。pgrep -a输出 PID 和完整命令不夹杂其他过滤条件ps -C按命令名精确过滤并可自定义输出列。二者都能天然避开 grep 自身混入结果的问题也便于在监控脚本中直接取 PID 做二次判断。进程出现大量 ZOMBIE 状态时重点去看 PPID通常不是主进程故障而是子进程退出后没被父进程正确回收。4.2 用 free、df、du 分清三个“为什么变慢”系统变慢时三组命令的输出侧重点完全不同下表总结最容易相互混淆的三组命令关注内容典型误区free -h物理内存、交换分区、available看到 cached 就误认为内存不足df -h文件系统容量与挂载点只看容量不看 inodedu -sh目录或文件实际占用空间对整个根目录执行IO 被拉到极限free输出中真正需要看的是 available 一列。多数发行版上 cached 占用大量内存这是页缓存的正常形态系统需要时会自动回收不必因此去杀进程真正该警惕的是 available 已低于几个 GB且同时观察到 swap 使用率上升。df -h查看容量后顺手执行一次df -i哪怕空间还剩几百 GBinode 耗尽时照样写不了文件而这种情况在大量小日志目录的机器上并不少见。du -sh适合定位目录从某个起点逐层计算字节数是最吃元数据的操作之一不要对全盘执行。要定位当前目录下占用最大的前 5 个一级目录标准写法是du -x --max-depth1 /var | sort -k1 -h -r | head -5-x限制不跨越文件系统边界避免挂载的 NFS 目录把结果拉偏--max-depth1只统计一层sort -k1 -h按第一列的人类可读大小排序-r反转成从大到小最后的head -5只保留前五行。如果某个目录突然多出数 GB再用lsof L1检查被删除但仍在占用文件句柄的进程这往往是空间没释放的幕后原因。4.3 top 的交互快捷键与 systemctl 的边界top界面里可以按P按 CPU 排序按M按内存排序按k再输入 PID 来终止进程按q退出。交互式界面虽然方便生产环境里手动 kill 进程仍然要非常谨慎直接 kill 会绕过服务管理器的监控和自动拉起被 supervisor 或 systemd 管辖的服务接下来几秒大概率会被重新创建反而留下“杀不掉”的假象。先查服务状态再决定干预路径是更稳的流程systemctl status nginx --no-pager--no-pager关闭分页输出适合 SSH 长连接与脚本内直接查看。如果服务处于 failed 状态systemctl restart nginx会重新执行 service 文件中的标准动作包括 EnvironmentFile 加载和环境变量注入手动用二进制路径启动则完全不走这条路径环境变量和目录权限都可能与预期不一致。所以凡是 systemd 托管的服务优先考虑 restart 和 stop而不是 kill对 Docker 内的进程则优先使用docker stop让镜像的启动配置完整执行一遍。4.4 journalctl 查看最近时间窗口的日志定位服务问题的顺序应该是先确认时间窗口再确认服务 unit最后才看具体报错。一条可直接复用的命令journalctl -u nginx --since 1 hour ago --no-pager | tail -100-u nginx限定 unit--since只输出最近一小时的记录--no-pager避免交互式打断tail -100保留最后 100 行通常就足够覆盖一次异常前后发生的完整事件。如果输出为空升高过滤等级再查看journalctl -u nginx -p err --since 1 hour ago --no-pager可能是当前时间窗口内确实没有 error 级别日志也可能是 journald 对日志大小做了裁剪。两种原因处理方式不同前者需要扩大时间窗口后者需要在/etc/systemd/journald.conf里调高 SystemMaxUse 后重启 journald操作之前先执行df -h /var/log确认磁盘有余量再动配置。5. 把 Linux 常用命令串成自己的操作链grep、别名与历史复用5.1 grep -n 与上下文是日志搜索里的第一优先级搜日志最忌讳一屏输出全部命中。先记住一条命令grep -rn error /etc/nginx --include*.conf-r递归目录-n同时输出行号--include*.conf只扫指定后缀文件避免二进制或缓存文件干扰。看到具体行之后再加-C 3取前 3 行和后 3 行就能直接基于上下文判断这是一条请求错误还是配置错误。要更进一步做统计grep -c统计行数grep -o只打印匹配部分与 sort、uniq 组合在一起就能把一段日志瞬间改造成计数报表。5.2 把高频组合沉淀到 .bashrc而不是反复搜手册与其每次搜索“linux 命令大全”不如把当天手敲超过三次的组合命令沉淀进~/.bashrcalias llls -lahF alias du1du -h --max-depth1 | sort -h alias filesfind . -type f -name第一行把ls -lahF缩写成ll第二行让du1直接呈现当前目录下占用最大的目录排序第三行定义files *.log作为递归查找入口。保存后执行source ~/.bashrc即可生效不需要重新登录。git 常用命令、docker 常用命令这些同属于 Linux 命令行生态的子集也可以用同一套思路沉淀。最后再回来看这些别名里的固定路径把它们换成$HOME/workspace这类变量就得到真正适合自己工作机的常用命令集。本文还有配套的精品资源点击获取
返回列表