刚入行那会儿,我总以为后端开发就是写写业务逻辑、调调接口。直到第一次接手线上服务器排查,面对黑漆漆的命令行界面,连最基本的日志查看都不会,才意识到Linux命令就是后端工程师的生存技能。不同于前端开发者可以靠浏览器调试工具,后端的问题往往需要直接在服务器上"动手"。
十年间我带过不少新人,发现一个规律:能快速定位线上问题的开发者,Linux命令功底都不会差。从简单的文件查看到复杂的性能分析,命令行的效率远高于图形界面。特别是在分布式架构成为主流的今天,掌握Linux命令就像外科医生熟悉手术刀——这是解决问题的直接工具。
ls -alh 是我的终端里出现频率最高的命令之一。新手常犯的错误是只用ls查看当前目录,而忽略了参数的价值:
-a 显示隐藏文件(比如.gitignore)-l 列表形式展示权限、所有者等元数据-h 人类可读的文件大小(自动换算KB/MB)实际工作中我习惯用组合命令快速定位文件:
bash复制# 查找最近修改的日志文件
ls -lt /var/log/nginx | head -5
# 按大小排序当前目录文件
ls -lSh
bash复制# 搜索包含ERROR的日志(-i忽略大小写)
grep -i "error" app.log
# 显示匹配行及前后5行上下文
grep -C 5 "timeout" system.log
bash复制# 提取访问日志中的IP和响应时间
awk '{print $1,$NF}' access.log
# 统计接口调用次数
awk '{count[$7]++} END {for(url in count) print url,count[url]}' nginx.log
bash复制# 替换配置文件中的旧域名
sed -i 's/old.domain/new.domain/g' config.yml
# 删除日志中的敏感信息
sed -E 's/(password|token)=[^&]*/\1=REDACTED/g' debug.log
code复制top - 14:30:45 up 60 days, 3:22, 1 user, load average: 0.15, 0.21, 0.18
Tasks: 125 total, 1 running, 124 sleeping, 0 stopped, 0 zombie
%Cpu(s): 2.3 us, 1.2 sy, 0.0 ni, 96.3 id, 0.2 wa, 0.0 hi, 0.0 si, 0.0 st
MiB Mem : 7986.8 total, 102.4 free, 4567.3 used, 3317.1 buff/cache
MiB Swap: 2048.0 total, 1832.1 free, 215.9 used. 3204.3 avail Mem
关键指标解读:
bash复制vmstat 1 5 # 每秒采样,共5次
重点关注:
bash复制iostat -dx 1 # 显示扩展统计,每秒刷新
关键列:
netstat/ss 替代方案:
bash复制ss -tulnp # 比netstat更快的替代品
输出解读:
tcpdump 抓包实例:
bash复制# 捕获80端口HTTP流量
tcpdump -i eth0 -A -s0 'port 80'
# 抓取MySQL查询(慎用!)
tcpdump -i lo -s0 -l -w - dst port 3306 | strings
除了基础的chmod 755,实际项目中这些场景更常见:
bash复制# 递归设置目录权限(保留文件执行权限)
find /app -type d -exec chmod 755 {} \;
find /app -type f -exec chmod 644 {} \;
# 设置粘滞位(共享目录常用)
chmod +t /shared_upload
# ACL高级权限(单个文件特殊授权)
setfacl -m u:deploy:rwx config/prod.yaml
bash复制# 标准做法
nohup java -jar app.jar > app.log 2>&1 &
# 忘记nohup时补救
Ctrl+z
bg
disown -h %1
ini复制# /etc/systemd/system/myapp.service
[Unit]
Description=My Application
After=network.target
[Service]
User=appuser
WorkingDirectory=/opt/myapp
ExecStart=/usr/bin/java -jar app.jar
Restart=always
[Install]
WantedBy=multi-user.target
bash复制# 优雅关闭Java应用
kill -15 <pid>
# 强制终止(慎用)
kill -9 <pid>
# 重新加载配置(需程序支持)
kill -HUP <pid>
案例:分析Nginx访问日志TOP10接口
bash复制awk '{print $7}' access.log | sort | uniq -c | sort -nr | head -10
复杂案例:统计每分钟请求量
bash复制awk -F'[: ]' '{print $2":"$3}' access.log | uniq -c
现代应用日志多为JSON格式,jq工具必不可少:
bash复制# 提取特定字段
cat app.log | jq '.timestamp, .level, .message'
# 条件过滤
cat error.log | jq 'select(.level == "ERROR") | {time: .timestamp, msg: .message}'
# 复杂转换
cat audit.log | jq '[.user,.action,.resource] | @csv' -r
bash复制tmux new -s dev_session # 新建会话
Ctrl+b d # 分离会话
tmux attach -t dev # 重新接入
bash复制# 端口转发(本地5432映射到远程数据库)
ssh -L 5432:localhost:5432 user@dbserver
# 免密登录配置
ssh-keygen -t ed25519
ssh-copy-id user@remote
bash复制openssl x509 -in cert.pem -text -noout # 查看证书详情
openssl s_client -connect example.com:443 -servername example.com | openssl x509 -noout -dates # 检查远程证书
bash复制# 生成随机密码
openssl rand -base64 12
# 计算文件哈希
sha256sum important.zip
bash复制# 快速定位大文件
du -h --max-depth=1 / | sort -h
# 查找并删除7天前的日志
find /var/log -type f -name "*.log" -mtime +7 -delete
# 特殊场景:处理大量小文件
rsync -a --delete empty_dir/ target_dir/
bash复制jmap -dump:live,format=b,file=heap.hprof <pid>
bash复制jstack <pid> > thread.txt
bash复制# 连通性测试(带时间戳)
while true; do date +%T; curl -s -o /dev/null -w "%{http_code} %{time_total}\n" http://api.example.com; sleep 1; done
# 路由追踪(TCP模式)
tcptraceroute api.example.com 443
# 连接状态统计
netstat -n | awk '/^tcp/ {++S[$NF]} END {for(a in S) print a, S[a]}'
掌握这些命令后,你会发现自己处理问题的速度明显提升。刚开始可能需要查手册,但经过几个线上问题的"洗礼",这些命令就会成为肌肉记忆。建议在自己的开发机上搭建测试环境,定期练习这些命令组合。