一、基础操作篇(新手必看)
1. 查看系统信息三剑客(必考)
uname -a
:打印所有系统信息(内核版本、主机名等)lsb_release -a
:显示发行版信息(适合Debian/Ubuntu系)cat /etc/os-release
:查看系统版本文件(通用方法)
(超级重要)很多面试官会故意混淆这些命令,一定记清适用场景!!!
2. 文件权限管理(翻车高发区)
遇到权限问题先执行ls -l
看权限三组:
-rw-r--r-- 1 root root 4096 Aug 1 10:00 example.txt
数字权限计算法:读=4,写=2,执行=1
比如设置用户可读写执行,组可读执行,其他人无权限:chmod 750 filename
3. 进程管理三板斧
ps aux | grep nginx
:精准定位进程kill -9 PID
:强制终止进程(慎用!)systemctl status httpd
:服务管理新姿势(Systemd体系)
(真实案例)曾用killall -HUP nginx
实现不停机重载配置,面试官眼前一亮!
二、Shell脚本篇(中高级必备)
4. 调试脚本的隐藏技巧
在脚本开头加set -x
开启调试模式,比单纯用echo高效10倍!
5. 参数传递的坑
#!/bin/bash
echo "第一个参数: $1" # 正确写法
echo "参数总数: $#" # 不是${#}!!!
(常见错误)新人经常把$#
写成${#}
,导致脚本报错
6. 文件操作黑科技
while IFS= read -r line
do
echo "处理行: $line"
done < "filename"
用这个结构处理大文件比for
循环靠谱100倍!避免内存爆炸问题
三、性能调优篇(拉开差距关键)
7. 内存分析神器
free -h
看整体,top
看实时,smem -s uss
看进程实际内存占用(超实用!)
8. IO性能诊断
iostat -dx 1 # 看设备级IO
iotop -o # 看进程级IO
发现某次MySQL卡顿竟是innodb_flush_method
设置不当导致IO等待暴涨!
9. 网络连接分析
ss -tnlp # 比netstat更快更准
nethogs # 实时流量监控
lsof -i:80 # 查端口占用
(血泪教训)曾用tcpdump
抓到过恶意爬虫,瞬间征服技术总监
四、安全加固篇(大厂最爱问)
10. SSH安全五重防护
- 改端口:
Port 2222
- 禁用root登录:
PermitRootLogin no
- 密钥登录:
PasswordAuthentication no
- 失败锁定:
pam_tally2
模块 - 防火墙配置:
ufw allow 2222/tcp
11. 入侵检测三板斧
lastb
:查看异常登录尝试rkhunter
:Rootkit检测chkrootkit
:查常见后门
12. 权限最小化原则
用visudo
设置精细化的sudo权限,比无脑给root安全10000倍!
五、高频刁钻题(压轴题)
13. 软链接 vs 硬链接
- 软链接:inode不同,可跨分区,源文件删除即失效
- 硬链接:inode相同,不可跨分区,删除源文件仍存在
(面试陷阱)很多候选人分不清ln -s
和普通ln
的区别
14. 僵尸进程处理
先用ps aux | grep Z
找到僵尸进程父PID,然后kill -HUP PPID
优雅解决
15. 快速清空大文件
> filename
比rm + touch
快100倍!特别是处理GB级日志文件时
六、实战场景题(加分项)
16. 服务器突然卡顿,如何快速定位?
top
看CPU/内存iostat
看磁盘IOiftop
看网络流量dmesg | tail
查内核日志
17. 如何不重启加载新配置?
- Nginx:
nginx -s reload
- Systemd服务:
systemctl daemon-reload
- 环境变量:
source ~/.bashrc
18. 紧急修复误删文件
别慌!立即卸载分区,用extundelete
或专业数据恢复工具
七、最新趋势题(2024版)
19. 容器化环境下的Linux新挑战
- cgroups资源限制
- namespace隔离机制
- 容器内进程监控技巧
20. eBPF技术应用
用bpftrace
做性能分析,比传统工具更底层高效!
避坑指南(来自10年运维老鸟)
- 慎用
rm -rf /*
(你以为不可能?我见过实习生真这么干过!) - 修改关键配置前先备份(用
cp filename{,.bak}
超方便) - 养成看
man
手册的习惯(比百度靠谱100倍)
最后送大家一句真理:Linux玩得溜,全靠日志看得透!建议把/var/log/
当第二个家~
文章目录
一、你以为的二分法 VS 真实的二分答案
还在以为二分法只能用来找数组里的元素?年轻人,你该更新知识库了!(拍肩)今天要聊的二分答案,简直是算法界的变形金刚,能把各种棘手问题按在地上摩擦!!!
传统二分查找就像在图书馆找书:已知书架上的书是按顺序排列的。而二分答案更像是侦探破案:你根本不知道答案在哪,但可以通过不断缩小嫌疑范围锁定目标。这就是它最骚的地方——不需要有序数据,只需要能判断某个值是否满足条件。
二、哪些问题适合"上二分"?(实战场景分析)
2.1 最优解问题
比如经典的"木头切割"问题:给定n根原木,要切成至少k段等长木料,求最大可能长度。直接枚举长度会超时?二分答案教你做人!
2.2 可行性验证问题
像"在D天内运送货物"这种题目,表面看是调度问题,实则二分答案的完美猎物。通过猜测每日运量,快速验证是否可行。
2.3 最值逼近问题
求函数极值、工程优化参数等场景,当数学方法复杂时,二分答案就是简单粗暴的救星。比如求sqrt(n)的整数部分,用二分比牛顿迭代更易懂。
三、手把手实现二分答案(代码级详解)
3.1 通用模板三步走
def binary_search_answer():
left = 最小可能值
right = 最大可能值
while left < right:
mid = (left + right + 1) // 2 # 避免死循环的魔法数字
if check(mid): # 这个判断函数就是灵魂!
left = mid
else:
right = mid - 1
return left
3.2 关键点把握
- 区间开闭:就像买衣服选尺码,大了小了都不行。建议初始区间宁大勿小
- 终止条件:while循环用 < 还是 <=?这直接决定要不要最后check结果
- mid计算:向上取整还是向下?这关系到会不会陷入死循环的噩梦
(超级重要)最易错点:当搜索空间包含答案时,mid的计算方式要和check条件严格匹配!举个🌰:求最大值时应该保留满足条件的右半区间。
四、实战案例:LeetCode 410 分割数组的最大值
4.1 问题重述
给定非负整数数组nums和整数m,将数组分割成m个连续子数组,使这些子数组各自和的最大值最小。
4.2 二分思路拆解
- 确定搜索范围:max(nums) <= 答案 <= sum(nums)
- 设计check函数:给定一个候选值max_sum,判断是否能分成<=m个子数组
- 二分框架搭建:找满足条件的最小max_sum
4.3 代码实现
def split_array(nums, m):
def feasible(threshold):
count = 1
total = 0
for num in nums:
total += num
if total > threshold:
total = num
count += 1
if count > m:
return False
return True
left, right = max(nums), sum(nums)
while left < right:
mid = (left + right) // 2
if feasible(mid):
right = mid
else:
left = mid + 1
return left
4.4 复杂度分析
时间复杂度O(n logS),其中S是数组元素和。相比动态规划的O(n²m),简直是降维打击!
五、来自老司机的避坑指南
5.1 常见翻车现场
- 区间更新写反方向(把left=mid写成right=mid)
- 忘记处理边界条件(比如所有元素都相同的情况)
- check函数时间复杂度过高(必须保证是O(n)或O(1))
5.2 调试技巧
在check函数里打印当前mid值,观察区间收缩过程。就像给算法做X光检查,哪里卡住一目了然。
5.3 进阶优化
- 预处理加速:对数据做前缀和等预处理
- 并行计算:当check函数计算量大时,用多线程处理
- 记忆化搜索:缓存已计算过的mid结果
六、你以为结束了吗?(扩展思考)
现在你已经掌握了二分答案的基本套路。但真正的艺术在于如何把实际问题转化为适合二分的模型。试着用这个思路解决以下问题:
- 在旋转排序数组中找最小值(LeetCode 153)
- 制作m束花所需的最少天数(LeetCode 1482)
- 吃香蕉的珂珂(LeetCode 875)
(终极挑战)自己设计一个看似与二分无关的问题,然后用二分答案解决它!比如:在社交网络中找出影响力传播的最优种子数量。