
很多人学 Linux 基础指令会卡在第二周cd、ls、cp 都会敲了但一到真实任务——明天要上线一个脚本、服务器磁盘突然满了、同事离职留了一台没人认领的机器——就不知道从哪下手。这不是基础不够是缺了一条把命令串起来的主线。上一篇《Linux基础指令1》解决的问题是“能操作”怎么进目录、怎么看文件、怎么拷数据。今天这篇作为系列第二篇目标要往上提一档解决“能干活”查状态、管进程、护数据。适合刚入门的运维新手、正在系统学 Linux 的学生以及那些把 Linux 当日常工具却一直没好好梳理过命令的开发者。我不会按 man 手册给你念参数而是按真实服务器场景把最常用的那一小撮命令讲透。1. 到了第二篇该把命令用出“管理”的味道了基础指令1里的命令基本都是“单兵作战”型pwd、ls、cd、cp、mkdir、less它们解决的是“我在哪、这里有什么、怎么把文件挪过去”这类单点问题。但在真实服务器上使用习惯是链条式的先看系统状态再定位问题然后采取措施最后回头验证结果。中间每一步都会用到好几个命令且彼此有依赖关系。第二篇我会围绕三条主线展开查状态进程、磁盘、系统时间、网络。机器不是黑盒任何操作之前先看一眼当前状况。管进程让任务在前台、后台、脱离终端三种状态下都能按你的意图运行并且能安全地停掉。护数据权限隔离、压缩归档、谨慎删除。这三件事决定了你的系统在事故面前是“虚惊一场”还是“直接重构”。很多人问“为什么我背了命令还是不会用”答案就在于脑子里没有这几条主线。举个例子你收到告警说根分区满了。有主线的人会直接走一套组合拳df -h看整体、du -sh /var/log逐层缩小范围、ls -lh看大文件、tail -n 50确认是不是日志刷爆、systemctl restart或truncate收尾。没主线的人只会反复敲df -h然后对着 100% 的发呆。命令还是那些命令区别在于你有没有形成操作套路。另外说一句题外话网上经常有人问“Linux 能不能装搜狗输入法”“Linux 能不能跑微信”能但这类需求背后涉及包管理、依赖库、启动脚本、环境变量 PATH 这些基础概念。你把这篇文章里的用户权限、软件安装、进程管理搞明白那些问题自然就通了。2. 文件操作升级从“会删”到“删对”从“会找”到“找全”2.1 删除命令 rm 的三重确认习惯热搜词里“linux删除文件夹命令”排得特别靠前说明很多新手要么不敢删要么删出过事。删除本身不难rm -rf 目录名一敲就完事。真正难的是删之前那几秒钟的确认。我的习惯是固定走三步先列目录不直接删ls -la /path/to/dir确认路径真实存在确认里面内容是你以为的那些。用变量保护路径把路径写进变量再删比如dir/home/backup/oldlogs然后rm -rf $dir。加引号是关键——如果变量是空的rm -rf $dir可能变成rm -rf没有目标问题还不大但如果你写的是rm -rf /$dir/变量一空就变成了删除根目录这种事故在论坛里见过不止一次。删除前先找备份或确认可重建配置文件的删前备份通常是一条cp file file.bak日志类的删前可以先确认没有程序正在写。实际工作中我见过最惨的案例不是手滑敲错命令而是写脚本时变量没判空。一个部署脚本里写了rm -rf /home/sync/$project/结果$project因为上游配置缺失变成了空字符串脚本就以 root 身份执行了rm -rf /home/sync/整个目录的家底全部清空。这个教训值得每个学 Linux 的人记住变量参与删除命令时永远加引号永远先 echo 打印一遍。2.2 mv 不只是移动重命名和覆盖的坑mv第二高频用途是重命名。mv old.txt new.txt或者mv file.txt /data/logs/把文件挪走。但这里有个默认行为很坑目标文件已存在时mv 会静默覆盖不会问你“是否覆盖”。跟cp一样默认不带-i的情况下直接覆盖。我建议你的 shell 配置文件.bashrc里加上别名alias mvmv -i alias cpcp -i代价是每次覆盖都会多按一次 y但换来的是不会在批量操作时无声无息地弄丢文件。养成习惯之后再想卸载这个别名都难。批量重命名是热搜里另一个高频点“linux用shell重命名文件”。最稳妥的写法是清晰的 for 循环不要随手写太花哨的正则for f in *.txt; do mv $f ${f%.txt}.md done${f%.txt}是 Shell 的参数扩展意思是去掉变量f末尾的.txt后缀。这种写法可读性强出问题也好排查。有一点要注意mv 跨文件系统不同磁盘分区时不是单纯的改名而是先复制后删除大文件会明显变慢而且文件 inode 会变如果你有硬链接指向它链接关系会断。判断是否跨分区可以用df分别看两个路径所在挂载点。2.3 find 查找按名字、按时间、按大小基础指令1里用ls找文件只能看当前目录想全盘搜就得靠find。我最常用的几个条件find /var/log -name *.log -type f按文件名和类型普通文件过滤。find /data -mtime 30 -type f找出 30 天前修改过的文件。-mtime按天-mmin按分钟配合定时清理非常好用。find / -size 100M -type f找大文件排查磁盘占用时一找一个准。find的灵魂是-exec或管道它能把“找”和“后续动作”串起来。但我不建议直接-exec rm {} \;真实项目里更安全的是“先列出确认再删”两步走find /data/archive -mtime 90 -type f -exec ls -lh {} \; # 确认列表没问题后再执行删除 find /data/archive -mtime 90 -type f -delete-delete是 find 自带的安全删除动作它不会递归删除目录本身只删匹配到的文件。另外提一个高频小技巧find排除某个目录用-not -path */node_modules/*清理项目时有奇效。3. 进程与后台任务nohup 是服务器上绕不开的坎3.1 先学会读 ps 的输出进程管理第一步不是杀进程而是会看进程。ps aux和ps -ef是两大流派我个人习惯用ps auxps aux | head -n 10关键字段不多看这张表就够了字段含义使用价值USER进程属于哪个用户定位是不是被入侵/被误启动的进程PID进程号后续 kill 的对象%CPU占用 CPU 百分比找 CPU 飙高的元凶%MEM占用内存百分比找内存泄漏的元凶STAT进程状态S 睡眠、R 运行、Z 僵尸Z 状态需要特别处理COMMAND启动命令确认这个进程到底是什么快速定位某个程序用ps aux | grep python但 grep 会把自己也匹配进去输出里会多一个grep --colorauto python的进程。老手常用的规避技巧是写成ps aux | grep [p]ython用方括号让 grep 的正则不会匹配到自身命令行。另外pgrep -af python更简洁直接只输出 PID 和完整命令行。3.2 top 实时监控load average 到底看什么ps是静态快照top是动态的。top第一行有三个 load average 数值分别表示过去 1、5、15 分钟的系统平均负载。很多新手看到负载 3 就慌了其实要先查 CPU 核数——负载 3 在 8 核机器上算轻载在双核机器上才是满载。可以用nproc查核数。top运行过程中按P按 CPU 排序按M按内存排序按z高亮显示。如果你发现进程状态是Z僵尸进程说明子进程结束了但父进程没回收它。僵尸进程杀不掉PID 已经死了正确的处理是定位它的父进程修好父进程的回收逻辑或者重启父进程而不是kill -9僵尸本身。3.3 nohup 与后台运行终端关了任务不能断热搜词里有一条“linux 让后台运行指令 不因界面退出而退出”对应的核心命令就是nohup。这个需求太真实了SSH 登录服务器跑一个训练脚本或者一个 Web 服务一切正常但只要你一关终端进程就没了。原因是终端关闭时内核会向会话中的进程发送 SIGHUP挂断信号进程默认会随之退出。nohup的作用就是让进程忽略 SIGHUP 信号。但要注意nohup默认还有一个副作用它会自动把进程的标准输出写到当前目录的 nohup.out 文件。如果当前目录不可写命令会失败。所以标准用法是显式指定日志文件nohup python train.py train.log 21 拆开解释 train.log把标准输出重定向到文件21把标准错误也指向标准输出当前指向的位置也就是同一个文件最后的把进程放到后台执行shell 不会阻塞。任务跑起来后盯日志用tail -f train.log。这里有一个经常写反的重定向细节21必须放在 train.log的右边。因为重定向是从左到右处理的先让标准输出指向文件再把标准错误指到标准输出所指向的地方两个流才能进同一个文件。如果倒过来写21 train.log标准错误会先指向当前标准输出也就是终端然后标准输出才被重定向到文件结果是错误信息仍然打在你屏幕上日志文件里只有 stdout。如果完全不关心输出可以写成nohup command /dev/null 21 /dev/null就是 Linux 的“黑洞设备”所有写进去的数据直接丢弃。在脚本里经常见到的三种写法各有用途 /dev/null只丢标准输出错误还能看见21 /dev/null这种错误组合最好别用 /dev/null 21才是两者全丢。另外还有一个跟相关的命令disown。它能把已经启动的后台任务从当前 shell 的作业表中移除配合可以在不重开进程的情况下让它脱离终端管理。但说实话日常场景里我大部分时间直接用nohup ... 一条命令解决简单、直观、不绕弯。3.4 kill 的安全顺序先温柔再暴力停进程的命令是kill但直接kill -9是最粗暴的做法。kill默认发送的是 SIGTERM信号 15相当于通知进程“请你做收尾工作后退出”进程可以自己决定怎么走释放连接、落盘数据、清理临时文件。而kill -9发送 SIGKILL由内核直接终止进程不给任何清理机会。如果进程正在写数据库或者正在生成文件kill -9很可能留下一堆半截数据。我的经验是两步走kill PID # 先发 SIGTERM等 5~10 秒 kill -9 PID # 没退再用 SIGKILL 兜底按名字杀进程可以用pkill比如pkill nginx按完整命令行匹配用pkill -f但要注意-f会匹配到很多意外的东西比如pkill -f python可能把一个正在跑训练的python train.py和另一个无关的python agent.py全部带走。宁可用pgrep -af先精确列出再逐个 kill PID误杀这件事在服务器上代价很高。4. 用户、权限与组多用户系统的必修课4.1 新建用户的正确姿势热搜词里“linux新建用户”频率很高。Linux 里新建用户有两套命令useradd和adduser。Debian/Ubuntu 上adduser是交互式脚本会一步步问你设置密码、填信息对新手友好useradd是底层命令参数多但更可控。生产环境我习惯用useradduseradd -m -s /bin/bash -G sudo deploy passwd deploy-m自动创建家目录/home/deploy。-s /bin/bash指定默认 shell不指定的话某些系统会给/bin/sh交互体验差很多。-G sudo把用户加入 sudo 附加组这样他有权限执行特权命令。CentOS/RHEL 系通常是-G wheel具体看系统初始配置。给已有用户加组有个大坑usermod -G groupname user会覆盖这个用户之前的所有附加组如果你本想追加应该用usermod -aG groupname user。-aappend就是追加少了它用户会从其他组里被踢出去可能导致服务权限直接挂掉。我在生产环境里至少踩过一次血的教训。删除用户用userdel -r username-r会同时删除家目录和邮件池。至于“为什么不能一直用 root 操作”除了安全考虑还有一个很实际的原因root 的误操作没有拦截机制。普通用户删错文件会因权限不足报错root 不会——它直接执行把系统删没了也只是程序员的日常。用普通用户登录需要特权时再sudo这个习惯越早养成越好。4.2 chmod 的 rwx 数字拆解权限是 Linux 新人最容易绕晕的点其实核心就是ls -l第一列那十个字符第一个字符是文件类型d目录、-普通文件、l软链接后面九个字符分成三组对应 owner属主、group属组、others其他人的权限。每组最多三个 rwxr 读、w 写、x 执行。数字表示法的逻辑是读4写2执行1三数相加就是一组权限。比如数字含义字符表示7读写执行rwx6读写rw-5读执行r-x4只读r--0无权限---所以chmod 755的含义是属主 rwx、属组 r-x、其他人 r-x。这也是最常见的目录权限配置属主完全控制其他人能读能进但改不了。普通文件则常用644rw-r--r--。有个细节值得说普通文件默认创建出来是 644 而不是 755因为系统默认不会给你“可执行”权限。这不是反人类设计而是防止有人往目录里丢一个脚本你随手一执行就把环境搞坏了。如果你想让一个脚本能运行得手动chmod x script.sh。此外chmod -R 777是安全反面教材。把整个目录或整个项目变成所有人可读写执行等于在自己的系统上开了个不设防的后门。如果临时需要共享文件优先考虑chmod 755或单独给某个组开权限而不是一把梭 777。4.3 chown 和 sudo归属与授权的边界chown修改文件属主和属组chown user:group file。部署软件时经常需要把安装目录从 root 转给运行用户比如 Nginx 的日志目录要给nginx用户写权限就得chown -R nginx:nginx /var/log/nginx。sudo 的配置文件是/etc/sudoers千万不要直接用 vim 编辑要用visudo。visudo会在保存前做语法检查语法错误会阻止保存防止你把自己锁在提升权限的门外。配置行的格式是username ALL(ALL) ALL %groupname ALL(ALL) NOPASSWD: /usr/bin/systemctl第二行表示groupname组的所有成员执行 systemctl 时不需要输入密码。这个按需授权的思路在自动化脚本里非常重要但别贪省事堆太多 NOPASSWD——我见过有的同学给user ALL(ALL) NOPASSWD: ALL其实等于把 root 密码扔了。真要这么干还不如去解决“为什么要用 root 跑日常任务”这个根本问题。5. 系统时间、磁盘与网络先看数据再动手5.1 date 与时间同步日志和证书都靠它Linux 查看系统时间用date设置时间用date -s 2025-06-01 10:00:00。但手动设置只适合临时用服务器必须走自动同步否则时间漂移会带来一堆连锁问题日志时间对不上、HTTPS 证书校验失败、定时任务在错误的时间点执行。管理时间同步首选timedatectlsystemd 系统都有timedatectl status输出里会显示本地时间、UTC 时间、RTC 时间、时区和 NTP 是否激活。开启自动同步就一条命令timedatectl set-ntp true如果是老系统没有 timedatectl手动同步用ntpdate ntp.aliyun.com或ntpdate ntp.ntp.org.cn但需要先停掉 chronyd 或 ntpd 才能手动执行。判断时间是否同步成功可以连续两次date看秒数是否正常跳或者用timedatectl timesync-status查看最近一次同步结果。5.2 磁盘排查df 看整体du 找真相处理“磁盘满了”告警标准流程是df -h看哪个分区满了。du -sh /var/log、du -sh /home这类命令逐层缩小范围。在可疑目录里跑du -h --max-depth1 | sort -rh | head -n 20列出最大的 20 个子项。需要注意df和du的统计口径不一样。df看的是文件系统的块使用情况du是逐文件累计的大小。当文件被进程 open 之后又删除比如删了正在写的日志文件df仍然显示空间占用不变du却已经找不到这个大文件了——因为空间被那个已删除但仍被进程占用的 inode 握着。这种情况的解法不是继续删文件而是重启那个进程或者用truncate -s 0 /var/log/xxx.log把文件截断为 0 字节让文件大小归零进程还能继续写。我处理过最典型的场景是/var/log/journal无限膨胀。systemd 日志默认没有硬性上限时间一长能吃掉几十 GB。用journalctl --vacuum-size100M可以把它压缩回指定大小这个操作比手动删 journal 文件安全得多。5.3 网络诊断与软件安装curl、ss、apt 的日常用法网络排查三件套ping -c 4 8.8.8.8探测基本连通性。如果 ping IP 通但 ping 域名不通多半是 DNS 配置问题检查/etc/resolv.conf。ss -tlnp列出所有 TCP 监听端口和对应的进程。这个命令在“端口被谁占了”“服务到底起没起来”两个场景下特别好用。老教程里常写的netstat已经逐渐被ss替代新系统不一定装了 netstat但 ss 基本都在。curl -I https://example.com只看 HTTP 响应头排查 Web 服务、接口是否正常。curl -L -o file url下载文件并跟随重定向。软件安装是另一块高频需求。Ubuntu/Debian 系sudo apt update # 更新软件源索引装东西之前先跑 sudo apt install python3-pip sudo apt remove nginx # 卸载配置文件一般保留 sudo apt purge nginx # 卸载并删除配置CentOS/RHEL 系则用yum install、yum remove。很多人问“linux系统安装python”怎么装其实就是先apt update再apt install python3 python3-pip这一套。如果系统自带 Python 3 版本太老你就得有“编译安装”或“加第三方源”的觉悟这又会牵扯到 PATH 和 alternatives 的调整。这里提一句update-alternatives它解决的是“系统里多个版本的工具怎么切换”的问题。比如你手动装了新的 Python 3.11系统自带的还是 3.8就可以用update-alternatives --config python3来切换默认版本。它本质上是一个符号链接管理器不改变软件本身只是改变命令指向的具体路径。对基础用户来说知道有这个东西、会用它切换版本就够了。把这一节的所有知识串起来就是一个完整的排障现场发现磁盘告警df -h确认根分区满du定位到/var/log/journal膨胀用journalctl --vacuum-size100M清理再df -h验证空间已释放。整个过程没有任何一个叫“排障”的命令全是这些基础指令的组合。最后再分享一点我的体会。带过不少新人之后我发现从“会敲命令”到“会管系统”的门槛其实不在记性在意识。命令只是工具真正值钱的是“先看再动、边动边验、留好退路”这套操作节奏。这一篇里讲的命令没有一个算冷门但它们组合起来覆盖了日常服务器维护里 80% 的场景。你把这几个套路练成肌肉记忆下一篇文章要聊的网络配置和 systemd 服务管理学起来就会顺很多——那是另一个值得好好梳理的体系了。