很多人学 Linux 都有个误区,以为指令就是背出来的。背了 ls、cd、pwd、cp、mv 就觉得入门了,再背一堆命令名就觉得自己会运维了。但真正到了服务器上处理问题,你会发现卡住你的往往不是“不知道这个命令”,而是“知道命令名字,但不知道怎么组合、怎么用对”。
这个系列的第一篇我们聊了最基础的目录切换、文件增删、查看帮助这些热身动作。这篇“Linux 基础指令 2”就往前走一步,专门挑那些日常使用频率极高、但新手最容易用错、面试也总爱问的指令来做深度拆解。覆盖文件查找、用户权限、文本处理、网络排查、进程管理这几个方向,适合已经会最基本的操作、准备接手真实服务器或者正在准备运维/后端面试的人。
每一段我都会把“为什么这么用”讲清楚,而不是丢给你一个命令列表让你自己背。顺便把我这些年踩过的坑兜底写出来,省得你再走弯路。
1. 文件与目录操作:真正能救命的查找和删除
1.1 别再只会 ls,find 才是文件查找的正主
很多新手找文件就靠 ls,一层一层 cd 进去翻,翻到怀疑人生。真正常用的文件查找工具是 find,它不靠文件名索引,而是实时遍历指定目录,所以只要路径给得对,它一定找得到,不存在“索引没更新”的情况。这也是 find 在脚本里被高频使用的原因。
先看几个我几乎每天都会用到的 find 写法:
bash复制# 全盘找 nginx.conf,屏蔽掉权限不足的报错
find / -name "nginx.conf" 2>/dev/null
# 找当前目录下所有 7 天前的 .log 文件
find . -name "*.log" -mtime +7
# 找当前目录下所有空目录
find . -type d -empty
# 找 /var/log 下大于 500M 的文件
find /var/log -type f -size +500M
这里要注意几个细节。第一,-name 后面的匹配规则是通配符,不是正则,*.log 这种写法要加引号,防止 shell 先把 * 展开掉。第二,-mtime +7 表示修改时间在 7 天以前,-mtime -7 表示 7 天以内,这个正负号经常有人搞反。第三,2>/dev/null 是每个 Linux 老手都该养成习惯的写法,不然你在 / 下遍历,满屏都是 “Permission denied”,真正的结果被淹没在噪音里。
find 真正强大的是可以和动作参数组合:
bash复制# 找到 7 天前的 .log 文件并删除
find . -name "*.log" -mtime +7 -exec rm {} \;
# 找到权限不对的脚本并批量加执行权限
find . -name "*.sh" -perm 644 -exec chmod +x {} \;
# 先看一眼再删,别直接动手
find . -name "*.tmp" -mtime +3 -exec ls -lh {} \;
-exec 后面的 {} 是占位符,表示 find 找出来的每一个结果,\; 表示命令结束。这个写法每次执行一个 rm 或 chmod,速度稍慢但足够安全。如果你文件特别多,想追求性能,可以配合 xargs:
bash复制find . -name "*.log" -mtime +7 | xargs rm -f
但我不太建议新手这么干。一旦文件名里有空格、换行这种特殊字符,xargs 默认按空格切分就会把路径拆烂,导致误删文件。虽说有 -print0 这种处理方案,但平时手动操作,我宁愿用 -exec 慢一点,也不愿意冒误删的险。
1.2 删除文件夹:rm -rf 不是万能钥匙
rm -rf 大概是 Linux 圈子里最有名的命令,也是翻车率最高的命令。
如果你要删除一个非空目录,确实需要 rm -rf,但这里有几个铁律必须记死:
- 不到万不得已,不要用
rm -rf /,这会把整个系统根目录删掉。 - 不要用
rm -rf *配合模糊匹配,*在某些情况下可能展开成空字符串,命令会变成rm -rf,直接报错还好,怕的是在脚本里配合变量一起用。
举个真实例子,我见过有人写脚本清理旧备份:
bash复制cd /backup
rm -rf $BACKUP_DIR
结果某次调度任务里 $BACKUP_DIR 这个变量没传进来,变成了空值。实际执行的命令是:
bash复制rm -rf /backup
整个备份目录被连锅端。这种事故的根源不是 rm -rf 本身,而是“变量可能为空却没做保护”。正确姿势是加一层判断,或者至少把路径写绝对、避免在脚本里用通配符做删除。
bash复制if [ -n "$BACKUP_DIR" ]; then
rm -rf "/backup/$BACKUP_DIR"
fi
还有个小习惯可以救命:在用 rm -rf 删重要目录之前,先用 du -sh 看一眼目录大小,再 ls 确认一下自己要删的是不是目标,删除命令执行完马上 ls 父目录确认结果。多花十秒,能省下恢复数据的一天。
如果你想“假删除”,可以自己建个 Trash 目录,用 mv 代替 rm,等确认没有问题了再清空。真实服务器上这个习惯尤其重要,谁都会手滑,但手滑之后能不能反悔,区别就大了。
1.3 磁盘占用排查三件套
文件找得到、删得掉,还不够。服务器跑着跑着磁盘满了,你总得知道东西占在哪儿。
我排查磁盘占用基本就是三个命令轮流用:
df -h:看分区整体使用率。du -sh *:看当前目录下每一项占多少空间。du -h --max-depth=1 /var 2>/dev/null | sort -rh | head -20:把指定目录下的一级子目录按占用大小倒序排出来。
记住 df 和 du 的结果经常对不上,这是正常的。df 看的是文件系统层面,du 是遍历文件算出来的,如果一个文件被删除但还被进程占用,df 显示已释放,du 却查不到明显的大文件占用,这时候就是用 lsof | grep deleted 排查残留进程的时机。这个知识点面试也爱问,后面网络排查部分会一起讲。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 用户与权限:从 useradd 到 sudo 的完整链路
2.1 新建用户的正确姿势
热词里有一个“linux 新建用户”,这是每台服务器初始化都要做的事情。但很多新手会用错命令,把 useradd 和 adduser 混在一起。
在 CentOS/RHEL 系里,只有 useradd,adduser 是它的软链接。在 Debian/Ubuntu 系里,useradd 是底层工具,adduser 是个交互式的 Perl 脚本,会自动帮你建家目录、设密码、填用户信息。所以如果你在 Ubuntu 上想快速建用户,直接 adduser 更省事;如果你在写脚本、做自动化,用 useradd 才能保证行为可控。
新建一个用户的完整操作步骤通常是这样的:
bash复制# 创建用户,同时创建家目录并指定默认 shell
useradd -m -s /bin/bash zhangsan
# 设置密码
passwd zhangsan
# 把用户加入 sudo 或 wheel 组,给管理员权限
usermod -aG wheel zhangsan # CentOS/RHEL
usermod -aG sudo zhangsan # Debian/Ubuntu
这里最容易忽略的是 -m 参数。不加的话,不会自动创建 /home/zhangsan,用户登录后落在 / 目录,文件到处乱放,后面一大堆麻烦。我见过不止一次,有人建完用户没加 -m,然后怎么 ssh 登录都报错,因为 shell 家目录都不存在。
建完用户后,可以用 id zhangsan 验证一下 uid、gid 和所属组。如果发现用户已经存在,想改默认 shell,用:
bash复制usermod -s /bin/bash zhangsan
想锁定用户、禁止其登录:
bash复制usermod -L zhangsan
这些参数都不难,难的是理解“Linux 权限是围绕用户和组设计的”这件事。后面讲权限位的时候,你就知道为什么要先搞懂用户体系了。
2.2 三个文件看懂账号体系
Linux 所有本地用户的账号信息,核心就存在 3 个文件里:
/etc/passwd:用户基本信息,一行一个用户,用冒号分隔 7 个字段。/etc/shadow:密码哈希和密码策略,普通用户不可读。/etc/group:组信息,用户组关系。
/etc/passwd 的 7 个字段依次是:用户名、密码占位符(x)、uid、gid、注释信息、家目录、登录 shell。比如:
bash复制zhangsan:x:1001:1001::/home/zhangsan:/bin/bash
这里有个比较经典的“坑”:如果你把用户的登录 shell 改成 /sbin/nologin 或 /usr/sbin/nologin,这个用户就不能登录了,只能作为服务账号用。很多软件安装后会自动创建这种 nologin 用户来隔离权限,比如 nginx 默认就有一个 nginx 用户,所以不要看着 passwd 里一堆不认识的用户就慌。重点看 uid 小于 1000 的一般都是系统内置账号,别乱删就行。
/etc/shadow 里面那个密码哈希串,开头通常带 $1$、$5$、$6$、$y$ 这样的前缀,分别代表 MD5、SHA-256、SHA-512 和 yescrypt 算法。看到 ! 或 * 开头表示账号被锁定或者没有密码,不能登录。这算面试里比较细的考点。
2.3 chmod/chown:权限位的“数字密码”
文件权限是 Linux 新手最大的认知门槛,但一旦理解了,后面看啥都通。
ls -l 看到一长串如 -rw-r--r--,拆开就是 10 个字符:第 1 个表示类型(- 文件,d 目录,l 软链接),后面 9 个分成三组,分别代表 所有者、所属组、其他人 的权限。每组里的 rwx 分别对应读(4)、写(2)、执行(1)。
数字权限就是把这些值加起来。chmod 755 表示所有者 rwx(4+2+1=7)、组 r-x(4+1=5)、其他人 r-x(5)。这就是最常见的“文件所有者可读写执行,其他人和组只能读和执行”。
实际操作中我发现新手最容易犯的错误,是把没有执行权限的文件给了 777,或者对安全要求高的配置给了 777。而正确的习惯是:
- 配置文件通常
644。 - 脚本要执行就给
755。 - 私钥文件必须
600,绝不能用777,否则 ssh 直接拒绝使用该私钥。 - 目录至少要
755,否则其他人无法进入目录。
改所有者和组用 chown:
bash复制chown zhangsan:appgroup app.log
chown -R zhangsan:appgroup /data/app/
-R 是递归,操作整个目录时必加,但加了之后要特别小心,别把系统目录的所有者改错了,否则可能直接导致服务无法启动。
还有一个面试爱考的点是 SUID。chmod u+s 之后,文件会以文件所有者的身份运行,而不是以执行者的身份运行。典型的例子是 /usr/bin/passwd,普通用户执行它时要临时获得 root 权限去改 /etc/shadow。这个机制挺强大,但也是最容易出安全隐患的地方,日常使用建议普通文件不要随便加 SUID。排查时可以用 find / -perm -4000 找出所有带 SUID 的文件,隔一段时间检查一次,算是安全基线。
3. 文本处理三剑客:grep、sed、awk 的实战组合
3.1 grep:不只是查找字符串
grep 是日志排查的绝对主力,但我发现很多人在真的需要它的时候才想起来用 grep,而且只会最简单的一个用法:
bash复制grep "error" app.log
这个用法没问题,但效率太低。实际工作中你至少得掌握这些:
bash复制# 递归搜索,直接找整个目录
grep -r "timeout" /etc/nginx/
# 比 -r 更好用:忽略二进制文件和隐藏目录
grep -rn --include="*.conf" "timeout" /etc/nginx/
# 显示匹配行前后几行,看上下文
grep -B 3 -A 5 "ERROR" app.log
# 只统计匹配行数,不打印具体内容
grep -c "exception" app.log
# 过滤掉匹配行,反选
grep -v "healthcheck" access.log
# 多条件,任意一个满足就输出
grep -E "ERROR|FATAL|WARN" app.log
-E 是扩展正则,等于 egrep。很多新手会用 grep 写 | 表示或,结果不生效,其实就是忘了这里是基础正则,| 有特殊意义,要么转义成 \|,要么直接用 -E。这个坑我至少见过十个新手踩过。
grep 在管道里的作用就更大了。比如看 nginx 日志里有哪些 IP 在访问,可以连着 uniq、sort 一起用:
bash复制grep "GET /api" access.log | awk '{print $1}' | sort | uniq -c | sort -rn | head -20
这条命令我先不拆开讲,等你看到 awk 那一节再回头看,会觉得简直是喝水一样简单。
3.2 sed:流式编辑,批量替换的神器
sed 的全称是 stream editor,流式编辑器。它的核心价值是不用打开文件,直接用命令对每一行做编辑,特别适合批量处理配置文件。
最常用的就是替换:
bash复制# 把 a.conf 中所有 8080 替换为 9090
sed -i 's/8080/9090/g' a.conf
# 替换前先备份,生成 a.conf.bak
sed -i.bak 's/8080/9090/g' a.conf
# 只替换第 10 行到第 20 行
sed -i '10,20s/8080/9090/g' a.conf
# 只替换端口配置段里的值
sed -i '/^port/s/8080/9090/g' a.conf
这里 s 是替换命令,g 是全局替换,不加 g 的话每行只替换第一个匹配。很多人只记得加 g,忘了 -i 才是真正写回文件的参数。不加 -i,sed 只会把处理结果打印到屏幕,原文件不动。所以我平时会建议新手先不加 -i 跑一遍,确认输出符合预期,再加 -i 真正落盘,或者用 -i.bak 留一个备份,这样即使错了也能回滚。
sed 还支持删除行、打印行。比如删掉 nginx 配置里的注释:
bash复制sed -i '/^#/d' nginx.conf
d 就是删除匹配的行。如果配置文件里有空行干扰,也可以删掉空行:
bash复制sed -i '/^$/d' nginx.conf
习惯上我不建议在真实服务器上一上来就用 sed 改系统级配置文件,比如 /etc/ssh/sshd_config 这种。先 cp 一份备份,再跑 sed,改完用 sshd -t 之类的语法检查命令验证一下,再重启服务。这套流程用了久了你就会发现,花一分钟做防护,省的是出事后的一小时。
3.3 awk:按列处理文本,日志统计的大杀器
awk 是个完整的文本处理语言,但日常工作根本不需要学全,掌握“按列提取 + 条件过滤 + 简单统计”就足够解决 80% 的问题。
最经典的场景是处理日志,nginx 默认日志格式里,第 1 列通常是客户端 IP,按空格分隔。所以:
bash复制# 只打印每个连接来源 IP
awk '{print $1}' access.log
# 找出状态码为 500 的记录
awk '$9 == "500"' access.log
# 统计每个 IP 出现次数
awk '{count[$1]++} END {for (ip in count) print ip, count[ip]}' access.log | sort -k2 -rn | head
这最后一条就是“分组统计”的思想:用数组 count 以 IP 为 key 累加,处理完所有行进入 END 块,遍历数组输出。再配合 sort 排序,就能快速看出哪个 IP 在疯狂刷请求。这条命令在面试里出现频率极高,也是线上定位 CC 攻击的常备武器。
awk 另一个高频用法是指定分隔符。默认按空格或 Tab 分隔,如果处理 /etc/passwd,就要用冒号分隔:
bash复制# 取出所有用户名字段
awk -F: '{print $1}' /etc/passwd
# 打印 uid 大于 1000 的用户名
awk -F: '$3 >= 1000 {print $1, $3, $7}' /etc/passwd
awk 的变量 $0 代表整行,$1 到 $n 代表分隔后的列。这个概念一旦想通,日志分析就打开了新世界。
这里给新手一个忠告:不要试图一天之内把 awk 的全部语法啃完,你只需要记住“它能把文本按列拆开,能做统计”就够用了。真正需要复杂逻辑的时候,直接写 Python 脚本处理可能更直观,awk 做不到硬上只会浪费时间。
4. 网络排查:看端口、传文件、查连接
4.1 看端口被谁占用了:ss、netstat、lsof
热词里有一个很典型的搜索“linux 的 9090 端口什么在用”,这应该是某个服务起不来或者端口冲突导致的排查需求。我来把完整的排查思路讲清楚。
现在的 Linux 系统里,netstat 已经不是必装的了,而且新版系统更推荐用 ss,它性能好、输出快。三个命令各有适用场景:
bash复制# 查看所有监听的端口(新版系统推荐)
ss -lntp
# 传统写法
netstat -lntp
# 通过进程名/端口反向查进程
lsof -i :9090
ss -lntp 里,-l 表示只显示 LISTEN 状态的端口,-n 不做域名反解(显示数字IP,速度更快),-t 只看 TCP,-p 显示占用进程。输出里你会看到 Process 那列,形如 1234/nginx,前四位是 PID,后面是进程名。
如果看不到进程名,只有 PID,多半是权限不够,加 sudo 再跑一次:
bash复制sudo ss -lntp | grep 9090
如果是 UDP 端口,把 -t 换成 -u 即可。实际排查“端口被占用”问题时,我的固定流程是:
ss -lntp | grep 9090找到占用进程 PID。ps -fp PID看这个进程到底是什么。- 如果确定不是自己需要的进程,再考虑 kill 或停服务。
千万别拿到 PID 就 kill,先确认是什么进程,防止误杀系统关键服务。之前我见过有人把 systemd 核心进程给杀了,机器直接原地卡死,只能强制重启。不搞笑,这事儿真的会发生。
如果你想看某个服务是否在监听,或者想排查 “端口明明没被占用但连接不上” 的问题,就要配合防火墙一起查:
bash复制# 查看防火墙规则是否放行了端口
firewall-cmd --list-ports # CentOS 7+ 防火墙
iptables -L -n | grep 9090 # 传统 iptables
很多新手发现服务监听正常、本机 curl 也通、外部就是连不进来,第一反应是改配置,折腾半天才发现是防火墙没放行。这个坑值得记下来。
4.2 远程拷贝文件:scp 和 rsync 的选择
服务器之间的文件传输,两种工具用得多:scp 和 rsync。
scp 简单直接,适合一次性拷贝。基本用法:
bash复制# 推送本地文件到远程服务器
scp ./backup.tar.gz root@192.168.1.10:/data/backup/
# 拉取远程文件到本地
scp root@192.168.1.10:/data/app.log ./
# 拷整个目录加 -r
scp -r ./logs root@192.168.1.10:/data/logs/
# 改端口用大写 -P
scp -P 2222 ./a.tar.gz root@192.168.1.10:/data/
这里有个特别容易踩坑的点:scp 指定端口是大写 -P,而 ssh 登录指定端口是小写 -p。大小写搞反,命令要么报错要么被当成别的参数,我至少接听过三次这种求助。
rsync 相比 scp 的强项是“增量同步”,文件已经存在且没有变化,就不重复传输,只传差异部分。对于大目录、大数据量,rsync 比 scp 高效得多:
bash复制# 目录同步,带归档、压缩、进度显示
rsync -avzP ./data/ root@192.168.1.10:/data/
# 删除目标端多余文件,保持两端完全一致(慎用)
rsync -avzP --delete ./data/ root@192.168.1.10:/data/
# 只同步指定类型文件
rsync -avzP --include="*.jpg" --exclude="*" ./data/ root@192.168.1.10:/data/
--delete 是个危险选项,它会让目标目录里那些源端已经删除的文件也消失。如果你不清楚自己的需求,第一次同步千万不要加 --delete,等完全确认了“源就是唯一标准”再加。之前有人同步站点目录加了个 --delete,结果源目录 mount 有问题,把所有线上的静态资源全“同步”没了。这种事一次就能长记性。
如果你需要做免密传输,建议配置 ssh 公钥认证,然后在 ~/.ssh/config 里配置好主机别名,这样 scp 和 rsync 都能直接通过别名连接,不用每次输密码。具体步骤属于 ssh 内网穿透和安全配置的范畴了,这里先不展开。
4.3 看 TCP 连接状态:排查抖动的第一步
ss -s 可以输出系统级 TCP 连接统计,快速判断是否有大量连接积压。ss -tan 可以列出所有连接的详细状态,重点关注 SYN_SENT、TIME_WAIT、ESTABLISHED 这几个状态。
- 如果大量连接停在
SYN_SENT,多半是目标端网络不通或者服务没监听。 - 如果大量
TIME_WAIT,说明连接本身是正常关闭,但系统在等待回收,高并发短连接场景常见,一般不用太紧张。 - 如果
ESTABLISHED连接数异常放大,就要看是不是有连接泄漏,配合lsof -i按连接数统计找出嫌疑进程。
“服务器突然变卡”这类问题,很多时候不是 CPU 满载,而是连接数打满、文件描述符耗尽。ulimit -n 可以临时查看/修改单进程文件描述符上限,ss -tan | wc -l 可以看连接总数。遇到服务 “Too many open files” 的报错,十有八九就是这类问题。排查思路固定下来以后,你会发现问题并不可怕,可怕的是不知道从哪里看起。
5. 进程与服务管理:从 ps 到 systemctl 的完整路径
5.1 ps 和 top:一眼找出吃资源的元凶
排查性能问题,第一步基本都是用 ps 或 top 找到目标进程。ps -ef 是查看全部进程的标准姿势,但要找 CPU 或内存占用最高的进程,我习惯这样:
bash复制# 按 CPU 使用率排序,取前 10 个
ps aux --sort=-%cpu | head -10
# 按内存使用率排序,取前 10 个
ps aux --sort=-%mem | head -10
ps aux 输出里,CPU 和内存使用率分别在第三和第四列。--sort=-%cpu 是倒序排列,带负号。这个命令比 top 更直接,适合一次性抓取快照。
top 适合持续观察。进入 top 后按 P 按 CPU 排序,按 M 按内存排序,按 c 展开完整命令行,按 q 退出。这些交互键新手总是记不住,其实只要记住 P、M、q 三个就够用了。还有一个更直观的工具是 htop,支持上下键选择进程、F9 直接杀进程,但默认没装,需要自己装。
找到异常进程后,如果确定要杀掉,kill 是基本功:
bash复制kill 1234 # 默认 TERM 信号,请求进程优雅退出
kill -9 1234 # KILL 信号,强制杀死,进程没有机会清理资源
kill -9 是很多人遇到杀不掉的进程就用的杀手锏,但我建议不到最后一刻不要轻易上。kill -9 直接让内核终止进程,进程自己来不及清理临时文件、释放锁、关闭连接,如果是数据库之类的服务,还可能导致数据文件损坏。正确顺序是先 kill,等几秒,如果还不退再用 kill -9。这就像两个人交流,先好好说,不听再动手。
5.2 systemctl 服务管理:以 nginx 为例
现代 Linux 发行版管理服务基本都用 systemd,操作指令非常统一:
bash复制systemctl start nginx # 启动
systemctl stop nginx # 停止
systemctl restart nginx # 重启
systemctl reload nginx # 重新加载配置,不用停服务
systemctl status nginx # 查看状态
systemctl enable nginx # 开机自启
systemctl disable nginx # 取消开机自启
这里我要重点讲 reload 和 restart 的区别。restart 是彻底停掉再启动,会短暂中断服务;reload 是让进程重新读取配置文件,服务不会断。对于 nginx 这种可以通过信号平滑加载配置的服务,改配置后优先 reload,而不是 restart。
有些新手不知道服务配置文件写错了会导致什么后果。systemctl restart nginx 的时候如果配置文件有语法错误,服务会起不来,但你从输出里未必能直接看到详细信息。这时候用 systemctl status nginx 或 journalctl -u nginx 查看日志才能真正定位问题。
nginx 自带一个语法检查命令:
bash复制nginx -t
这个命令在改完配置后跑一下,可以提前暴露错误。类似的,sshd 有 sshd -t,防火墙有 firewall-cmd --reload 前也没有专门的语法检查,只能靠 iptables -t nat -L -n 看规则状态。每次改配置之前备份、改完检查、再 reload,这个习惯能让你少熬很多夜。
5.3 看日志:journalctl 和 dmesg
服务起不来或者异常退出,光看 systemd 状态往往不够,要看日志。systemd 管理的服务日志统一由 journald 收集:
bash复制# 查看某个服务的全部日志
journalctl -u nginx
# 只看最近 50 行
journalctl -u nginx -n 50
# 跟踪输出,类似 tail -f
journalctl -u nginx -f
# 看指定时间段的日志
journalctl --since "10 minutes ago" -u nginx
系统启动阶段的问题、硬件问题、内存溢出等,看 dmesg:
bash复制# 查看最近的内核环形缓冲消息
dmesg | tail -50
# 查找 OOM(内存耗尽)相关记录
dmesg | grep -i oom
线上遇到过一种情况:Java 进程突然消失,journalctl 里没有明显错误,但 dmesg 里显示 “Out of memory: Kill process”,说明是被操作系统 OOM Killer 干掉了。这种问题不看 dmesg 很难定位。所以排查进程意外死亡的问题,我的固定动作是:先 journalctl -u 服务名 -n 200,再看 dmesg | tail -100,双管齐下,基本不会漏。
5.4 进程与进程间通信:一个容易被面试官问到的宽泛话题
热词里出现了“linux 进程间通信”。这个词范围很大,但我在实际排查中见得最多的其实是三种:
- 管道:命令行里
|连接两个命令,让前一个的输出成为后一个的输入。 - socket:不同机器或本机不同进程通过 TCP/UDP socket 通信,比如 nginx 和 PHP-FPM 通过 9000 端口通信。
- 信号:进程之间发通知,
kill -HUP PID让进程重新加载配置就是典型的信号通信。
理解管道是玩转命令行的关键。ps aux | grep nginx 就是 “把进程列表的文本输出交给 grep 筛选”。很多人看管道符觉得是黑魔法,其实就是把数据从一个命令“流”到下一个命令。管道和重定向不同,重定向是写到文件,管道是交给下一个程序。二者的区别面试也爱问:> 是覆盖写文件,>> 是追加写文件,| 是把输出对接给下一个命令的输入。
面试题里还会问“如何优雅地让一个进程退出再启动”,标准答案是 kill -HUP PID。HUP 信号就是“终端挂断”时给进程发的通知,很多守护进程会监听这个信号做配置重载,比如 nginx、sshd 传统上都支持 kill -HUP 热加载。虽然现在主流都用 systemctl reload,但懂这个原理,才能理解 systemd 背后的信号机制。
6. 面试题与日常高频场景速查
6.1 这些命令在面试里会怎么考
我梳理了几道高频 Linux 指令面试题,都是“基础指令 2”这个阶段该掌握的,也是真实工作中真的会遇到的。
1. 查找 /etc 下所有大于 50M 的文件并删除
bash复制find /etc -type f -size +50M -exec rm -f {} \;
面试官看的是你会不会用 find 的组合条件,以及删除是不是加了确认。
2. 统计 access.log 中每个 IP 的访问次数,按降序排列
bash复制awk '{count[$1]++} END {for (ip in count) print count[ip], ip}' access.log | sort -rn
3. 查看端口 8080 被哪个进程占用
bash复制ss -lntp | grep 8080
lsof -i :8080
4. 如何把文件中的 localhost 全部替换成 127.0.0.1
bash复制sed -i 's/localhost/127.0.0.1/g' file.conf
5. 如何让一个普通用户拥有 root 权限
bash复制usermod -aG wheel username # CentOS
usermod -aG sudo username # Ubuntu
这些题不算难,但能直接体现你的实战熟练度,而不是背课本。
6.2 日常维护常用的“一条龙”排查套路
服务器出问题,不要慌,按下面的顺序排查,比东一榔头西一棒子高效得多。
先看负载和内存:
bash复制uptime
free -h
再看到底哪些进程吃资源:
bash复制ps aux --sort=-%cpu | head -10
ps aux --sort=-%mem | head -10
接着看磁盘:
bash复制df -h
du -sh /var/log/* 2>/dev/null | sort -rh | head
再看网络连接数:
bash复制ss -s
ss -tan | grep -E "SYN_RECV|ESTABLISHED" | wc -l
最后看应用日志和内核日志:
bash复制journalctl -u 服务名 -n 100 --no-pager
dmesg | tail -100
这套流程走下来,80% 的“服务器突然变慢”“服务突然挂掉”都能定位出方向。剩下的 20% 大概率要展开业务链路,一层一层看日志、看监控,那就不是命令层面的问题了。
6.3 到底要不要记那么多命令?我的建议
写作关于命令的文章时,我经常被问:“这么多命令,到底哪些该背?”
我的个人看法是:不要背命令。要背“场景”。你不需要记住 sed 的所有参数,但要知道“我想批量替换文件内容时,有一个流式编辑器叫 sed,它能做到”。真到了用的时候,sed --help 或者 man sed 一查就有,但如果你脑子里没有“这件事可以这么做”的认知,那你连查什么都不知道。
还有一个习惯值得养成:遇到一条有用的命令,别只复制粘贴,自己敲一遍,看一下输出是什么,想一想为什么是这个结果。比如执行 ls -l 时,看一眼权限列的每一位是什么含义;执行 df -h 时,看一眼哪个分区快满了。这些看起来“多此一举”的观察,才是把指令变成直觉的唯一路径。
提示:Linux 里很多命令在不同发行版的默认行为有差异,比如
useradd在 CentOS 和 Ubuntu 上默认参数不同。写脚本、做自动化之前,最好先确认目标发行版的命令行为,不要想当然。我在生产环境里吃过的最大一次亏,就是默认 Ubuntu 的useradd会自动建家目录,结果迁移到 CentOS 上脚本完全不兼容,重建了一批用户的目录结构。
从文件查找、用户权限,到文本处理、网络排查、进程管理,这篇覆盖的都是真实服务器上每天都在用的东西。你如果能把这些场景串联起来,形成自己的排查思路,而不是单点记命令,那“Linux 基础指令”这层就算真正过关了。下一层就可以往网络原理、Shell 脚本、容器化方向走了。
