多彩编程 多彩编程MZPH · CODE BLOG
ARTICLE DETAIL

文章详情

深耕前端与后端开发技术的一线实战笔记与踩坑复盘。

Linux基础命令别只背:路径、进程与日志排查的一次小实验

Linux基础命令别只背:路径、进程与日志排查的一次小实验 原文是一份命令问答笔记。重新整理时我发现“知道命令名字”和“能正确排查问题”之间还差一步路径有没有引号、搜索的是哪个字段、输出有没有被覆盖、进程能否正常退出。这次把它改成一个安全的小实验。不读真实业务日志不终止已有服务文件只建在临时目录。1. 路径先看清空格不是两个目录绝对路径从/开始.是当前目录..是上层~在通常的Shell用法中展开为家目录。cd是切换目录pwd查看位置。work$(mktemp-d${TMPDIR:-/tmp}/linux-basics.XXXXXX)mkdir-p$work/log filescd$work/log filespwd目录名有空格所以变量和路径都加双引号。mkdir -p可以建立父目录rmdir只删除空目录。这里保留实验目录不使用递归删除命令结束后也不把它混进真实业务目录。后续命令在同一个Bash会话接着执行work变量才仍然存在。pwd输出会包含随机临时目录名不应把它写死成唯一正确结果。2. 造五行日志验证“最后几行”和“从第几行”printf%s\n\INFO boot\WARN retry\ERROR timeout\INFO ready\ERROR disconnectedapp.logtail-n2app.logtail-n3 app.log第一条返回最后两行即 INFO ready、ERROR disconnected第二条从第3行开始包括该行返回三行。这两个命令只差一个加号含义却不同。grep-nF--ERRORapp.logsed-n2,4papp.loggrep结果3:ERROR timeout 5:ERROR disconnected-n显示行号-F按固定字符串匹配--结束选项解析。它是“行内含ERROR”并没有自动理解日志等级字段。若需求是行首等级等于ERROR这份演示格式可以用grep -nE ^ERROR([[:space:]]|$) app.log结构化日志则应按真实格式解析。sed结果是第24行包含两个端点。原文用日期正则做地址范围只是从某个匹配行到后续某个匹配行不等于解析时间戳后的严格时间区间日志乱序、多行记录时尤其要注意。3. 跟踪日志-f与-F不是大小写随意换tail-F-- app.log|grep--line-buffered-F--ERROR这条持续跟踪命令需在需要时单独执行用CtrlC结束。GNU tail 的-F按名字跟踪并重试适合文件重命名后同名新文件出现的轮转情况-f默认跟踪已打开的文件描述符行为不同。GNU tail文档。管道中的grep使用行缓冲减少匹配输出在管道中被缓冲的等待。这不保证整条日志链路没有延迟也不能补救上游尚未写出日志。GNU grep文档。本次在临时目录验证了追加行和一次“重命名旧文件、创建同名新文件”的场景。只操作自建日志不拿真实服务练习轮转。4. 看文件不要顺手把它清空cat适合短文件head/tail看局部less分页vi/vim是编辑器打开后能改内容并非只读检查工具。head-n2app.logcat-- app.log原文把cat : textfile2当清空示例这是不准确的cat会尝试读取名为冒号的文件重定向却已经可能截断目标文件。不是查看操作它会创建或覆盖目标。只在已确认可以销毁内容的文件上才使用: 文件名这样的截断写法。本篇不把清空真实日志作为操作步骤也不建议排障时清除命令历史。touch并不总是“创建空文件”文件不存在时可创建已有文件会更新相关时间戳不把原内容自动清掉。小实验可以验证这一点touchapp.logwc-lapp.log仍然是5行。5. 找进程先确认对象再谈信号ps-p$$-opid,ppid,commpsaux第一条查看当前Bash进程PID每次会变不是示例中的某个固定数字。ps aux是常用BSD风格选项组合不把原文的ps -aux当作它的严格等价写法因为混合选项风格存在歧义。procps ps手册。原文ps -aux | grep *也不能表示“查指定进程”星号可能先由Shell展开成当前目录文件名grep收到的参数已不是想象中的模式。用明确的进程选择条件或命令名查询查看PID、用户和命令后再操作。kill发送信号不是一个只有“强制杀死”的动作。对自己创建的演示进程可以这样验证默认SIGTERMsleep30demo_pid$!ps-p$demo_pid-opid,commkill$demo_pidifwait$demo_pid;thenprintfprocess exited normally\nelseprintfdemo process terminated\nfi这里只终止刚创建并保存PID的sleep不用名称匹配批量终止。真实服务应先遵循服务管理器的停止流程SIGKILL不能让程序捕获并执行清理不能默认一上来就kill -9。僵尸进程等情况也不是追加一个-9就解决。6. 归档时指定文件输出放到被打包目录外下面仅打包当前实验日志归档文件放在临时工作目录外层。tar -t列出内容不会解包到当前位置。tar-czf$work/logs.tar.gz-C$worklog files/app.logtar-tzf$work/logs.tar.gz输出包含log files/app.log。不直接对陌生归档运行解包命令更不把系统目录或敏感日志顺手打包出去。7. 本次实测与边界在现有Ubuntu 24.04 WSL2中执行临时文件实验核对路径、tail、grep、sed、touch、tar和自建进程的SIGTERM。持续跟踪另用有超时与清理的测试器验证追加和轮转不留后台tail/grep进程。没有修改Ubuntu代理、系统配置或已有服务也没运行原文的历史清空命令。终端的WSL网络提示不影响这些本地命令实验。本文依赖GNU工具不能假定BusyBox、macOS的选项完全相同。这份笔记现在想留下的是一种顺序先确认路径和对象再读取证据最后才考虑会改变状态的命令。少背一个参数不致命把查看误写成覆盖才真的会让排障更难。
返回列表