ARTICLE DETAIL

资讯详情

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

Linux基础操作指令实战:从文件管理到日志清理

Linux基础操作指令实战:从文件管理到日志清理 直接和你说结论这次我整理的不是那种命令大全CtrlC列表而是把Linux运维和开发里真正高频、真正能救命的基础操作指令按照遇到什么场景该用哪条、为什么是这条、实测有哪些坑讲明白。新装一台Linux服务器、接手一个线上环境、甚至面试前突击这篇文章都能直接拿来用。1. 想把这篇文章的价值吃透先搞清楚Linux指令到底解决什么问题很多朋友一开始学Linux就陷入一个误区觉得记不住命令就是自己记忆力差。我入行前几年也这么想后来带新人才明白真正的问题不是记不住而是不知道每条指令背后解决的是什么问题。Linux基础操作指令说白了就是你和操作系统对话的语法。你下指令它执行指令本身没有感情但选择哪条指令、用什么参数体现的就是你的经验。这篇博文聚焦在六个高频场景文件与目录操作、权限与用户管理、进程与系统状态、网络与远程、日志清理、报错排查。这些场景覆盖了日常服务器维护里八成以上的操作。我故意不贪多像awk、sed、find的高级用法、shell脚本编程这些我会在后续的基础操作指令2、3里单独展开这篇先把地基夯实。文章适合这几类人刚接触Linux的运维新手或者转行做后端开发的同学需要一条不绕弯路的学习路径。用了Linux一段时间但总在几个命令上犯迷糊想看透原理的人。准备Linux面试想快速把基础指令串成体系的人。我自己带人的习惯是先让新人把这篇里的指令全部敲一遍然后在虚拟机里模拟各种故障用这些指令去排查。一套下来比死记硬背强太多。2. 文件与目录操作使用频率最高的几条指令2.1 导航三件套pwd、cd、ls刚接触服务器的人最容易懵的是我现在在哪。Windows有盘符有图形界面Linux终端打开之后黑漆漆一片像个迷宫。所以第一组指令就是定位。pwdPrint Working Directory打印当前所在目录的绝对路径。我每次登录服务器第一件事就是敲它尤其是隔了很长时间再登服务器先确认自己落在哪个目录再动手操作避免在错误的目录里执行删除或覆盖命令。cdChange Directory切换目录。几个高频用法cd ~回到当前用户的家目录cd ..回到上一级目录cd -回到上一次所在的目录这个技巧非常实用在两个目录之间切换时能省大量时间。lsList列出目录内容。不要只敲裸的ls我建议形成条件反射式习惯ls -l查看详细信息权限、属主、大小、修改时间ls -a查看包含隐藏文件在内的所有文件ls -lh让文件大小以人类可读的方式显示K、M、G。还有个细节很多人不知道ls -l输出的第一列有10个字符例如drwxr-xr-x。第一个字符表示类型d是目录-是普通文件l是软链接c是字符设备。后面9个字符分成三段分别代表文件属主、属组、其他人的读写执行权限。这段我放在后面权限部分详细讲。注意cd和ls这种指令没有任何输出不代表没执行成功。Linux的设计哲学是沉默即成功只有出错才会有提示。新人不适应这点老觉得没反应是不是坏了其实恰恰是正常的。2.2 文件创建、复制、移动与删除这组指令是我见新人翻车最多的区域尤其是rm。先说创建和复制再说删除的各种注意事项。touch filename创建空文件或者将已有文件的时间戳更新为当前时间。很多人只知道前一个用途不知道后一个。写脚本的朋友偶尔会利用这个特性触发某些按文件时间执行的定时任务但这属于进阶玩法。mkdir -p a/b/c递归创建多级目录。不加-p在a不存在时直接创建a/b/c会报错。加了-p之后系统会先把a建出来再建b最后建c。写自动化脚本时mkdir -p几乎是标配省去一层层判断的麻烦。cp source dest复制文件。常用参数是cp -r递归复制目录cp -p保留原文件的属性比如时间戳、权限。我单独提醒一下如果你在备份配置文件最好用cp -p这样万一后面要排查配置到底是什么时候改的时间戳还有参考价值。mv source dest移动文件或者重命名。mv在同一个文件系统内是原子操作速度极快所以移动大文件本质上更像是改了个名字。跨文件系统移动时mv会退化成复制加删除速度会慢很多。rm删除。这条必须着重说。生产环境里rm -rf /的笑话不是段子是真有人敲过。我的铁律如下删除之前先ls确认路径尤其是带通配符的删除先用ls *看看会匹配到什么。rm -i在删除前逐个确认虽然烦一点但能拦住手滑。绝对不要在生产环境用rm -rf去删除一个你不敢百分百确认的目录。重要数据先备份再删备份成本永远比恢复成本低。不夸张地说我在带新人时要求他们至少一周内不允许使用rm -rf必须用rm -i。等形成了每次删除前先确认路径的肌肉记忆才放开限制。2.3 文件内容查看与搜索服务器上排查问题本质上就是看各种各样的文件内容配置文件、日志文件、脚本文件。所以查看指令的熟练度直接决定排查速度。cat全量输出文件内容。适合小文件。文件一大终端会刷屏看前面的内容基本靠滚轮很痛苦。less分页查看按空格翻页、按q退出、按/搜索内容。这是我看日志的主力工具。配合less -N还能显示行号定位问题位置非常方便。head -n 20 file查看文件前20行。调试时我喜欢用head -n 100看日志的开头部分确认程序启动日志是否正常。tail -f file实时跟踪文件新追加的内容。部署服务后盯着日志输出看报错看请求这个方法我用得比编辑器还勤。tail -f在调试接口、观察日志增长场景下不可替代。grep按关键字搜索文件内容。最常用的用法是grep ERROR app.log。加上-n显示行号grep -i忽略大小写grep -r递归搜索目录。想看日志里某个接口的所有报错一条grep 接口名 error.log | grep ERROR就能搞定这就是组合指令的雏形。查看与搜索组合起来处理线上问题的高频套路是# 先看今天的日志有没有报错 grep ERROR $(date %Y%m%d).log | less # 实时跟踪最新写入的日志 tail -f /var/log/app.log | grep --line-buffered Exceptiongrep --line-buffered是为了让grep在管道模式下不是攒一批再输出而是每匹配一行就实时打印配合tail -f看实时日志才不会延迟。3. 权限与用户管理把谁能干什么彻底搞清楚3.1 新建用户与用户组服务器不是一个人的玩具尤其是多人协作的团队环境。权限管理混乱的后果很直接A误删了B的文件C改了D的配置追溯起来全是口水仗。所以用户管理是基础里的基础。useradd username新建用户。提一句很多新手以为useradd和adduser是一回事Debian/Ubuntu上adduser是交互式创建用户的脚本会提醒你设置密码、填用户信息更适合新手CentOS/RHEL上两个命令行为还不完全一样。我一律建议直接记useradd配合参数# 创建用户并指定家目录和默认shell useradd -m -s /bin/bash zhangsan # 设置密码 passwd zhangsan # 创建用户组 groupadd ops # 将用户加到组里 usermod -aG ops zhangsan-m表示创建家目录-s指定Shell。如果不加-m用户没有家目录后续登录会遇到一些奇怪的问题。userdel -r username删除用户并同时删除其家目录和邮件池。只删用户不删家目录会留下残留数据清理起来更麻烦。好习惯是为每个业务角色单独建用户而不是大家都用root操作。虽然初期麻烦一点但排查谁在几点做了什么时用户隔离的价值就体现出来了。我工作过的团队线上操作都是有独立的运维账号这是底线。3.2 chmod、chown的底层逻辑权限的本质是用户对文件能做什么读r4、写w2、执行x1。用数字表示的时候每个身份组的权限就是这三个数字的和。所以755意味着属主有读、写、执行权限421属组和其他人只有读和执行415。权限示例drwxr-xr-x d 目录类型标识 rwx 属主权限读写执行 7 r-x 属组权限读执行 5 r-x 其他人权限读执行 5chmod 755 script.sh设置属主可读写执行属组和其他人可读可执行。脚本部署常用这个权限。chmod 600 id_rsa私钥文件设置仅属主可读写。SSH私钥权限过宽会直接导致连接被拒绝这是新手常犯的错。chown user:group file修改文件的属主和属组。使用时要先确认当前用户有没有权限操作没有就加sudo。关于执行权限我多说一句。很多新人写了一个脚本执行时却报错Permission denied第一反应是用sudo跑。这个习惯很危险——脚本报错有多种原因一上来就用管理员权限会掩盖问题。正确操作是先ls -l查看权限如果是权限不足针对性地加执行权限chmod x script.sh而不是把所有问题都丢给sudo去解决。3.3 sudo到底怎么用才安全sudo的全称是superuser do即用超级管理员权限执行指令。为什么重要因为我们日常操作不该用root用户但某些指令确实需要高权限sudo就是那个平衡点。先用sudo visudo编辑sudoers文件可以精确控制哪些用户能执行哪些命令# 允许zhangsan执行所有命令 zhangsan ALL(ALL) ALL # 允许ops组的成员执行所有命令 %ops ALL(ALL) ALL # 允许zhangsan免密执行systemctl命令自动化脚本常用 zhangsan ALL(ALL) NOPASSWD: /usr/bin/systemctl生产环境中我见过不少团队给每个开发都配了NOPASSWD: ALL这是风险很高的做法。服务器一旦被入侵就等于把所有权限拱手让人。合理的做法是配最小权限需要用哪条命令就放开哪条。多写几条规则不丢人出一次事故才丢人。4. 进程管理与系统监控服务器不响应时怎么排查4.1 ps与top先看清进程现状服务器卡了CPU飙高、内存不足第一反应不是重启是看清楚到底怎么回事。进程管理指令就是干这个的。ps -ef显示所有进程的完整信息包括UID、PID、PPID、CPU占用、内存占用、启动命令等。ps aux和ps -ef功能类似但输出格式不同很多老运维习惯用这个。两者选一个用顺手就行我个人推荐ps aux输出里的%CPU和%MEM列很直观。top动态刷新进程列表和系统负载相当于任务管理器。按P按CPU排序按M按内存排序按q退出。系统变慢的时候top是第一排查工具。排查CPU爆满的套路# 找到占用CPU最高的进程PID top -bn1 | head -20 # 或直接排序输出前10个CPU占用最高的进程 ps aux --sort-%cpu | head -10找到PID之后再配合lsof -p PID或者ls -l /proc/PID/cwd就能定位到具体的程序和运行目录。有人问服务器CPU高是正常业务还是异常这个判断没有银弹我的经验是先确认进程是不是自己启动的再看启动时间是不是最近出现的最后看它的运行目录和日志。三步走完八成的异常进程能确认位置。4.2 kill的正确姿势别一上来就-9后台登录服务器最常遇到的就是有个进程卡死关不掉。大部分人第一反应是kill -9 PID。但其实kill家族是有等级之分的一上来就-9是战术上的懒惰。kill PID发送SIGTERM信号15请求进程优雅退出。这是给进程好好交接的机会它会保存状态、释放资源、清理临时文件。kill -9 PID发送SIGKILL信号强制立刻终止。进程没有机会做任何清理工作。正确姿势是先kill PID等两秒再用ps确认进程是否还在。还在的话再kill -9。很多新人不理解为什么要等因为进程处理SIGTERM需要时间有些程序要保存数据、关闭连接给个缓冲期是尊重程序的生命周期。有时候进程确实杀不死怎么kill -9都还在。这种情况大概率是进程处于不可中断的睡眠状态D状态通常是在等待I/O比如NFS挂载的目录卡住了。这种进程kill -9也杀不掉只能等I/O恢复或者重启机器。听起来很无奈但这是真实的操作场景。shutdown、reboot、halt这类系统关机指令本质上也是通过发送信号的方式通知系统进程进入终止流程只不过它们的目标是init或systemd。4.3 磁盘与内存查看业务出问题除了进程原因还有很大概率是磁盘满了或者内存不够。这一组指令可以帮你快速判断。df -h查看文件系统磁盘使用情况-h以人类可读方式显示。磁盘使用率超过90%就该预警了尤其日志分区涨起来真的快。du -sh *查看当前目录下每个子目录的总大小。磁盘快满时配合du -sh *从大到小排查是标准操作。free -h查看内存使用情况。注意看available列这才是真正能用的内存free列不等于可用内存因为Linux会利用空闲内存做缓存。iostat和vmstat属于更进阶的排查工具本篇不深入但记住名字遇到I/O瓶颈时再学。判断内存是否不够的标准做法是看free -h的available是不是明显偏低同时看top里的swap使用量是不是持续增长。如果swap一直在涨涨涨说明物理内存真的吃紧该考虑加内存或者优化程序了。5. 网络指令与远程管理5.1 查看网络状态与连通性网络这块我最常见的场景是连不上服务器先pingping通了再排查端口和服务。ip addr查看本机IP地址和网卡状态。CentOS 7之后ifconfig不再是默认安装ip addr是标准姿势。注意输出里UP和DOWN表示网卡状态inet就是IP地址。ping用ICMP探测目标主机是否可达。ping通证明网络层面通但不代表业务端口通。这俩不是一回事。ss -tnlp查看本机监听的TCP端口及对应的进程。很多新人用netstat但现在主流发行版更推荐ss输出更快更简洁。排查端口起没起来用这一条足够。telnet ip port测试目标IP的指定端口是否可达。注意提醒很多新系统默认没装telnet客户端可以用nc -zv ip port替代-z表示只扫描不发送数据。排查一个端口不通的完整链路是先ping确认网络层通不通再ss -tnlp确认本机端口监听了没最后看防火墙firewall-cmd或iptables有没有放行端口。顺序走完问题基本能定位。5.2 ssh远程连接远程管理Linux服务器绕不开SSH。这条通道的安全性直接决定服务器是不是裸奔。基础连接ssh userhostname生产环境推荐的做法# 1. 生成密钥对 ssh-keygen -t ed25519 -C your_comment # 2. 将公钥复制到服务器 ssh-copy-id userhostname密钥登录对比密码登录最核心的优势是防暴力破解。密码可以被字典爆破密钥几乎不可能。我在自己负责的服务器上都禁用了密码登录只保留密钥登录。在/etc/ssh/sshd_config里设置PasswordAuthentication no改完记得重启sshd服务。还有个高频需求是传文件scp和sftp是SSH自带的配套工具# 将本地文件上传到服务器 scp local_file userhostname:/remote/path # 从服务器下载文件到本地 scp userhostname:/remote/file /local/pathscp的断点续传和速度控制都比较弱传大文件我会用rsync这个放到后续文章细说。基础阶段先把scp用熟文件传输这块就够用了。5.3 传输文件与下载服务器上没有图形浏览器下载文件全靠命令行。wget url经典的下载工具支持递归下载、断点续传。常用参数-c断点续传-O指定输出文件名-q静默模式。# 下载到指定目录 wget -P /opt/downloads https://example.com/file.tar.gz # 断点续传 wget -c https://example.com/big.zipcurl url接口调试神器不仅能下载文件还能发送各种HTTP请求。# 查看响应头 curl -I https://example.com # 发送GET请求并带参数 curl https://api.example.com/user?id1 # 发送POST请求提交JSON数据 curl -X POST -H Content-Type: application/json -d {name:test} https://api.example.com/usercurl和wget的区别一句话说明wget专注下载curl专注与服务器交互。你是下载一个大文件用wget你是调试接口、发送请求用curl。6. 日志文件处理清理与排查日志是服务器的黑匣子。但日志文件有个讨厌的特性只增不减。时间一长磁盘就被日志塞满了。热词里那个linux 清空日志文件的问题确实是每个运维都会撞上的日常。这里详细讲讲日志的正确处理姿势。6.1 日志文件的常见位置Linux日志的主要存放位置是/var/log/目录。几个高频文件/var/log/messagesCentOS/RHEL系统的整体日志大部分系统级消息都会记在这。/var/log/syslogDebian/Ubuntu系统对应的是这个文件。/var/log/secure认证和安全相关日志SSH登录记录在这排查暴力破解就看它。/var/log/nginx/access.log、error.logNginx的访问日志和错误日志具体路径看Nginx配置。/var/log/mysql/error.logMySQL的错误日志。应用程序自己的日志位置不固定有的是/var/log/app/有的是应用安装目录下的logs/这个要养成读配置找日志路径的习惯而不是瞎猜。查看系统登录记录的实操# 查看最近10条登录成功的记录 grep Accepted /var/log/secure | tail -10 # 查看最近5条登录失败的记录 grep Failed /var/log/secure | tail -5排查暴力破解时这两条指令能快速定位问题。6.2 清空日志的正确姿势清空日志看起来简单但踩坑的人不少。最大的坑是有人直接rm日志文件然后业务进程还持有文件句柄导致磁盘空间不释放还可能出现新日志写不进去的情况。正确的清空方式是截断而不是删除。# 推荐方式清空文件内容但保留文件 cat /dev/null /path/to/logfile # 或 : /path/to/logfile # 也可以 truncate -s 0 /path/to/logfilecat /dev/null file的原理是把空设备的内容重定向覆盖到目标文件文件还在内容没了。truncate -s 0是直接指定文件大小为0更直接。验证是否清空可以用ls -lh看文件大小或者du -sh看实际占用。我第一次用这个方法看到磁盘使用率从95%掉到60%才理解文件句柄这个概念的重要性。注意清理/var/log/下的日志文件建议先停掉或者至少确认应用的日志写入方式。有些应用比如某些版本的syslog在日志文件被清空后会因为文件大小变化产生其他问题。稳妥的流程是先ls -lh确认文件大小接着用truncate -s 0清空再df -h确认空间是否释放。7. 常见问题与排查技巧实录7.1 高频报错速查表把几个最高频的报错整理成表方便对照处理。报错信息原因定位处理思路command not found命令不存在或未安装先确认命令拼写再用which检查路径必要时安装对应软件包Permission denied当前用户没有权限ls -l查看权限确认属主属组用chmod或chown修正No space left on device磁盘满df -h看哪个分区满了du -sh *找大目录清理日志或扩容Cannot allocate memory内存不足free -h确认内存ps aux --sort-%mem查内存大户考虑释放或扩容Address already in use端口被占用ss -tnlp查占用进程确认后kill或换个端口bash: etc/nginx/nginx.conf: Permission denied配置路径错误或权限不足重新核对路径注意是否存在相对路径问题必要时用sudo表格只能给结论实际排查时建议按报错文本 → 定位文件 → 确认依赖 → 恢复服务的链路逐步来。不要跳步跳步往往会造成误判。7.2 实操心得与避坑总结日常写Linux操作指令、带人做服务器维护我自己最深的几个体会集中列一下。第一敲命令前先想想会不会删错/覆盖错。删错文件是Linux新手翻车第一原因。我给自己定的规矩移动文件前先在目标目录ls一遍删除文件前先在当前目录pwdls确认。虽然麻烦但这样可以省掉后面恢复数据的巨大麻烦。第二多用相对路径的安全操作替代暴力操作。比如清理日志用truncate而不是rm杀进程先kill再考虑kill -9。这些所谓的习惯在关键时刻能救命。第三掌握组合指令思维。单个指令是单词组合起来才是句子。比如# 找哪个进程占用CPU最高 ps aux --sort-%cpu | head -5 # 日志文件越来越大先看最占地方的子目录 du -sh /var/log/* 2/dev/null | sort -rh | head # 查看某个服务监听的端口和状态 ss -tnlp | grep nginx把基础指令组合成解决问题的管道比单纯记住单条指令的价值高得多。第四shell脚本里注意指令的返回值。写自动化脚本时每条指令执行后可以用$?来检查是否成功。0表示成功非0表示失败。if [ $? -eq 0 ]; then echo OK else echo FAILED fi别小看这个判断脚本里90%的执行完了但结果不对都是因为下游指令没先确认上游指令是否成功。8. 最后再聊几句这篇只讲基础操作指令1故意做了克制没有把Linux全部内容塞进来。Linux操作指令本身是熟练工种光看文章不敲命令看十遍也记不住。我建议你打开一台虚拟机或者云服务器按照文章里的场景模拟一遍创建一个用户给它配置权限启动一个Nginx服务查看进程清理日志再把它停掉。一遍走完Linux基本操作的地基就稳了。我在实际带人的过程中发现一个规律能把基础指令用熟的人学shell脚本、学服务部署、学网络排障都会很快因为这些高级技能都是用基础指令搭出来的。基础不牢后面的高楼很难盖。如果你在实际操作中遇到哪条指令报错、哪个参数搞不明白这篇文章里没覆盖到的可以继续往后面几篇看。Linux这个东西只要多用、多踩坑、多复盘进步会很快。
返回列表