📋 Git & Linux 速查表 --- Java 后端向
一、Git 操作速查
🔥 最高频(日常必用)
| 命令 |
说明 |
git status |
查看工作区状态(最常用,肌肉记忆) |
git add . |
添加所有改动到暂存区 |
git add <file> |
添加指定文件到暂存区 |
git commit -m "type: 描述" |
提交到本地仓库(推荐语义化 message) |
git push |
推送到远程仓库 |
git pull |
拉取并合并远程更新(fetch + merge) |
git log --oneline -10 |
查看最近 10 条提交历史 |
git diff |
查看未暂存的改动 |
git diff --staged |
查看已暂存的改动 |
git diff HEAD~1 |
对比与上一次提交的差异 |
🌿 分支管理(核心工作流)
| 命令 |
说明 |
git branch |
查看本地分支列表 |
git branch -a |
查看所有分支(含远程跟踪分支) |
git branch -vv |
查看分支及其关联的远程分支 ✅ 推荐 |
git switch -c feat/xxx |
创建并切换到功能分支(Git 2.23+ 新语法) |
git switch main |
切换到已有分支(新语法,替代 checkout) |
git merge main |
将 main 分支合并到当前分支 |
git rebase origin/main |
将当前分支变基到最新 main(保持历史线性) |
git branch -d feat/xxx |
删除已合并的分支(安全删除) |
git branch -D feat/xxx |
强制删除分支(未合并也可删)⚠️ 危险 |
git push origin feat/xxx |
推送指定分支到远程 |
git push origin --delete feat/xxx |
删除远程分支 ✅ 新增 |
git push -u origin feat/xxx |
推送并建立上游跟踪关系(首次推送用) |
↩️ 撤销与回退(救火必备)
| 命令 |
说明 |
风险 |
git restore <file> |
撤销指定文件的未暂存改动(保留磁盘文件) |
🟢 安全 |
git restore . |
撤销所有未暂存改动 |
🟢 安全 |
git restore --staged <file> |
取消暂存(改动保留在工作区) |
🟢 安全 |
git reset --soft HEAD~1 |
撤销最近一次提交 → 回到暂存区 |
🟡 中等 |
git reset --mixed HEAD~1 |
撤销提交 + 取消暂存(默认行为) |
🟡 中等 |
git reset --hard HEAD~1 |
彻体撤销提交+暂存+工作区改动(不可逆) |
🔴 危险 |
git push -f origin main |
强制覆盖远程分支历史(协作用户会受影响) |
🔴 危险 |
git revert <hash> |
生成新提交 来撤销指定提交的内容(协作安全)✅ 推荐 |
🟢 安全 |
⚠️ 不可逆命令警示 :git reset --hard 和 git push -f 是 Git 中仅有的两个真正不可逆操作。执行前三思!团队仓库中优先使用 git revert 替代 reset。
💡 救命稻草:reflog --- 即使 git reset --hard 了也不必绝望 → git reflog 可查看 HEAD 所有移动记录 → 找到目标 hash → git reset --hard <hash> 即可恢复。
📦 远程仓库与协作
| 命令 |
说明 |
git remote -v |
查看远程仓库地址(fetch + push) |
git remote add origin URL |
关联远程仓库,命名为 origin |
git remote set-url origin URL |
修改远程地址(HTTPS ↔ SSH 切换场景) |
git fetch origin |
拉取远程信息到本地远程跟踪分支(不自动合并) |
git clone <URL> |
克隆远程仓库到本地 |
git clone --depth 1 <URL> |
浅克隆(只取最近一次提交,大仓库加速) |
git pull --rebase |
拉取时使用 rebase 而非 merge(避免多余 merge 提交)✅ 推荐 |
🚀 进阶操作
| 命令 |
说明 |
典型场景 |
git stash |
暂存当前所有改动(含暂存区和工作区) |
临时切分支修 bug |
git stash push -m "描述" |
带消息暂存(多个 stash 时便于识别) |
区分不同暂存 |
git stash pop |
恢复最近的 stash 并删除该条记录 |
改完 bug 回来继续 |
git stash list |
查看所有 stash 记录 |
有多个 stash 时定位 |
git stash drop stash@{n} |
丢弃指定的 stash |
清理无用暂存 |
git cherry-pick <hash> |
将指定提交移植到当前分支 |
跨分支复用某次修复 ⚠️ 可能产生冲突,需手动解决后 git cherry-pick --continue |
git tag v1.0.0 |
创建轻量标签 |
版本发布标记 |
git tag -a v1.0.0 -m "release" |
创建 annotated 标签(含作者、日期、备注)✅ 生产推荐 |
正式发版 |
git tag -l "v*" |
列出所有匹配标签 |
查看已有版本 |
git push origin --tags |
推送所有标签到远程 |
发版后同步 |
git reflog |
查看 HEAD 所有移动记录 |
误操作恢复神器 |
git bisect start |
二分查找引入 bug 的提交 |
回归问题定位 |
⚙️ 基础配置(新环境必设)
| 命令 |
说明 |
git config --global user.name "名字" |
设置全局用户名(首次使用必须配置) |
git config --global user.email "邮箱" |
设置全局邮箱(需与 Git 平台账号一致) |
git config --global init.defaultBranch main |
设置默认分支名 |
git config --global core.editor "code --wait" |
设置默认编辑器为 VS Code(rebase 冲突时用到) |
git config --list |
列出当前所有配置(可排查配置问题) |
git config --global core.autocrlf input |
Linux/Mac 上关闭自动换行转换(跨平台协作关键) |
🔑 SSH 密钥配置(免密推送刚需)
# 1. 生成密钥对(一路回车即可)
ssh-keygen -t ed25519 -C "your_email@example.com"
# 2. 查看公钥并复制
cat ~/.ssh/id_ed25519.pub
# 3. 将公钥添加到 GitHub/Gitee → Settings → SSH Keys
# 4. 测试连接
ssh -T git@github.com # GitHub
ssh -T gitee.com # Gitee
# 5. 如果端口非默认 22,在 ~/.ssh/config 中配置:
# Host github.com
# HostName github.com
# User git
# IdentityFile ~/.ssh/id_ed25519
# Port 443
📝 .gitignore 规范(Java 项目必备)
# === 编译输出 ===
target/
*.class
*.jar
*.war
*.log
# === IDE ===
.idea/
*.iml
.vscode/
# === 环境与密钥(绝对不能提交!)===
.env
*.local
application-*.yml # 含敏感信息的 profile 文件
# === OS ===
.DS_Store
Thumbs.db
# === 依赖缓存 ===
.mvn/
.gradle/
node_modules/
🔒 安全红线 :.env、application-prod.yml、*.key、credentials 等含敏感信息的文件严禁提交 到 Git 仓库。一旦泄露必须立即轮换密钥!建议配合 pre-commit hook 或 git-secrets 工具扫描。
📌 典型场景速查
🆕 第一次推送新项目
git init
git add .
git commit -m "init: 项目初始化"
git branch -M main # 确保主分支名为 main
git remote add origin https://github.com/user/repo.git
git push -u origin main # -u 建立上游跟踪,以后直接 git push
🔄 日常开发流程(Git Flow 简化版)
① git pull origin main → 拉取最新代码
② git switch -c feat/xxx → 基于 latest main 创建功能分支
③ 开发 & 小步提交(语义化 message)& 本地自测通过
④ git pull origin main && git rebase origin/main → 合入最新代码,保持线性历史
⑤ git push origin feat/xxx → 推送分支
⑥ 在 Gitee / GitLab 创建 Merge Request → Code Review → Maintainer 合并
🔥 误操作紧急恢复
# 场景:刚执行了 git reset --hard HEAD~1,发现丢代码了
Step 1: git reflog # 找到丢失提交的 hash,比如 abc1234
Step 2: git reset --hard abc1234 # 恢复到该位置,代码回来
# 场景:push -f 到远程后后悔了(需要队友协助)
Step 1: 让队友 git fetch origin
Step 2: 队友 git reflog 查看被覆盖前的 origin/main 位置
Step 3: 队友 git push -f origin THAT_HASH:main # 强制恢复
🔀 合并冲突处理流程
Step 1: git merge feature/xxx # 或 rebase 时遇到冲突
Step 2: 打开冲突文件,找到 <<<<<<< ======= >>>>>>> 标记区域
Step 3: 手动选择保留哪些代码,删除冲突标记
Step 4: git add <conflict-file> # 标记为已解决
Step 5: git commit # merge 场景:完成合并提交
# 或 git rebase --continue # rebase 场景:继续变基
# 放弃合并:git merge --abort / git rebase --abort
👥 团队协作核心原则
| ✅ Do |
❌ Don't |
| 主干保护(main/dev 设为受保护分支) |
禁止直接 push 到 main |
| 所有变更走 MR/PR + Code Review |
禁止在公共分支使用 reset --hard |
| 提交前先 rebase 最新代码 |
禁止提交 .env / 密码 / 证书 |
| 语义化 commit message |
禁止提交大二进制文件(图片/jar) |
| push 前先 status / diff 检查 |
禁止 copy 别人的代码不署名 |
📝 Commit Message 语义化规范(Conventional Commits)
| 类型 |
说明 |
示例 |
feat |
新功能 |
feat: 用户登录接口 |
fix |
Bug 修复 |
fix: 修复 Token 过期时间计算错误 |
docs |
文档变更 |
docs: 更新 API 接口文档 |
style |
格式调整(不影响逻辑) |
style: 统一代码缩进为 2 空格 |
refactor |
重构(非新功能非修 bug) |
refactor: 抽取 UserService 公共方法 |
perf |
性能优化 |
perf: 用户查询 SQL 加索引 |
test |
测试相关 |
test: 补充登录模块单元测试 |
chore |
构建/工具/依赖变更 |
chore: 升级 Spring Boot 至 3.2 |
二、Linux 命令速查(Java 后端向)
🔥🔥🔥 最高频 --- 日志排查(每天必用)
| 命令 |
说明 |
场景 |
tail -f app.log |
实时跟踪日志输出 |
排障第一命令 |
tail -f -n 100 app.log |
读最后 100 行再开始实时跟踪 |
应用刚启动时立即跟 |
tail -F app.log |
跟踪日志(支持文件轮转/重命名 )✅ 推荐 |
logrotate 自动切割场景 |
grep "ERROR" app.log |
搜索关键字行 |
快速定位报错 |
grep -i "exception" app.log |
忽略大小写搜索 |
Exception 大小写不一致 |
grep -C 5 "ERROR" app.log |
匹配行前后各显示 5 行上下文 |
✅ 最常用组合 看完整错误栈 |
grep -A 20 "Exception" app.log |
匹配行后显示 20 行 |
看完整异常堆栈 |
grep -r "keyword" ./src |
递归搜索目录下所有文件内容 |
全项目搜代码 |
less catalina.out |
分页浏览大文件(q 退出,/ 搜索) |
日志过大的唯一选择 |
head -50 app.log |
查看文件前 50 行 |
检查启动是否成功 |
wc -l app.log |
统计文件总行数 |
快速判断日志量级 |
💡 组合技 :grep "ERROR" app.log | grep "UserService" | tail -20 --- 管道串联,逐步缩小范围,比肉眼翻快 10 倍。
🔥🔥 高频 --- 进程与服务(部署必用)
| 命令 |
说明 |
| `ps aux |
grep java` |
jps -l |
列出 Java 进程及主类/JAR 全路径(JDK 自带,更直观)✅ 推荐 |
jstack <PID> |
打印线程堆栈(死锁/CPU 飙高排查核心工具) |
jmap -histo <PID> |
查看 JVM 堆对象统计(内存泄漏排查) |
jinfo -flags <PID> |
查看 JVM 启动参数 |
kill <PID> |
发送 SIGTERM 正常终止进程(进程可优雅关闭) |
kill -9 <PID> |
发送 SIGKILL 强制杀进程 ⚠️ 慎用 信号 9 不可被捕获,数据库连接池等资源无法正常释放,可能导致数据不一致 |
kill -15 <PID> |
等同 kill/SIGTERM,显式指定信号号(更明确)✅ 生产推荐 |
nohup java -jar app.jar > app.log 2>&1 & |
后台启动应用 + 输出重定向(生产标准姿势) |
echo $! |
获取上一个后台进程的 PID |
disown -h %1 |
让后台进程脱离当前终端(防止断连后被杀) |
🔥🔥 高频 --- 端口与网络
| 命令 |
说明 |
| `ss -tlnp |
grep 8080` |
| `ss -tlnp |
grep java` |
lsof -i :8080 |
查看端口占用(另一种方式,信息更详细) |
netstat -tlnp |
列出所有监听端口(兼容老系统) |
curl http://localhost:8080/actuator/health |
测试 Spring Boot 健康检查接口 ✅ 高频 |
curl -s -o /dev/null -w "%{http_code}" URL |
只看 HTTP 状态码(脚本中常用) |
curl -X POST -H "Content-Type: application/json" -d '{"k":"v"}' url |
发送 JSON 格式 POST 请求 |
ping -c 4 baidu.com |
测试网络连通性(限制 4 次,不会一直跑) |
telnet ip port |
测试 TCP 端口连通性 |
🔥 高频 --- 文件与目录操作
| 命令 |
说明 |
ls -lah |
列出详情 + 隐藏文件 + 人性化大小(默认习惯加 lah) |
cd - |
回到上一个工作目录(来回跳转超方便)✅ 推荐 |
pwd |
显示当前绝对路径 |
cat application.yml |
查看小文件内容(配置文件首选) |
mkdir -p a/b/c |
递归创建多层目录 |
cp -r src dest |
递归复制整个目录 |
mv old new |
移动或重命名 |
rm -rf dir |
强制递归删除 ⚠️ 不可逆 |
touch file |
创建空文件 / 更新时间戳 |
find /opt -name "*.jar" |
按名称查找文件 |
find /opt -name "*.jar" -mtime +30 |
查找 30 天前修改过的 jar 包 |
find /var/log -name "*.log" -size +100M |
查找大于 100MB 的日志文件 |
ln -s /path/to/target linkname |
创建软链接(部署常用:指向最新 jar) |
⚠️ rm 安全习惯 :执行 rm -rf 前 → ① 先用 ls 确认目标路径正确 → ② 优先用 trash 命令移到回收站(如有)→ ③ 绝对不在通配符不确定时使用 rm -rf *
📊 系统资源监控
| 命令 |
说明 |
关键指标 |
free -h |
内存使用情况(人性化单位) |
关注 available 列,接近 0 有 OOM 风险 |
df -h |
磁盘分区空间 |
Use% 超过 85% 就要警惕 |
du -sh * |
当前目录下各子目录大小 |
定位哪个目录占空间最大 |
| `du -sh /var/log/* |
sort -rh |
head -10` |
uptime |
系统负载(1min / 5min / 15min均值) |
超过 CPU 核数 × 2 说明压力大 |
top(按 1 切每核) |
实时资源占用(按 CPU 排序) |
按 P CPU排 / M 内存排 |
htop |
top 增强版(需安装:yum install htop) |
可视化更强,支持树形进程 |
iostat -x 1 |
磁盘 I/O 实时监控 |
%util 接近 100% = 磁盘瓶颈 |
sar -u 1 10 |
CPU 使用率历史采样(每秒采 10 次) |
性能分析报告素材 |
👤 权限与用户
| 命令 |
说明 |
chmod +x script.sh |
添加执行权限(实际最常用写法) |
chmod 755 dir/ |
rwxr-xr-x(所有人可读执行,所有者可写) |
chown user:group file |
修改文件所有者和所属组 |
chown -R user:group dir/ |
递归修改目录归属(部署后常用) |
whoami |
查看当前用户名 |
id |
查看当前用户 UID/GID 及所属组(更完整) |
sudo su - |
切换到 root 用户(- 同时加载 root 环境变量) |
📦 软件与环境
| 命令 |
说明 |
java -version |
检查 JDK 版本 |
which java / whereis java |
查看 Java 可执行文件路径 |
echo $JAVA_HOME |
查看 JAVA_HOME 环境变量 |
| `echo $PATH |
tr ':' '\n' |
alternatives --config java |
切换系统默认 JDK 版本(CentOS/RHEL) |
yum install xxx / apt install xxx |
安装软件包 |
| `yum list installed |
grep java` |
tar -xzvf archive.tar.gz -C /opt/ |
解压 tar.gz 到指定目录(JDK/Tomcat 部署常用) |
unzip file.zip -d target/ |
解压 zip 到指定目录 |
source /etc/profile |
刷新全局环境变量 |
export VAR=value |
设置临时环境变量(当前终端有效) |
🌐 远程连接与文件传输
| 命令 |
说明 |
ssh user@192.168.1.100 |
SSH 远程登录服务器 |
ssh -i key.pem user@host |
使用 PEM 密钥文件登录(AWS/阿里云常用) |
ssh -p 2222 user@host |
指定端口登录 |
scp file.txt user@host:/opt/ |
上传文件到服务器 |
scp -r dir/ user@host:/opt/ |
上传整个目录 |
scp user@host:/opt/file ./ |
从服务器下载文件 |
rsync -avz ./src user@host:/opt/ |
增量同步(比 scp 快,支持断点续传 )✅ 大量文件推荐 |
wget https://example.com/file.jar |
下载文件(支持断点续传 -c) |
⚙️ Systemd 服务管理(生产部署主流)
| 命令 |
说明 |
systemctl start myapp |
启动服务 |
systemctl stop myapp |
停止服务 |
systemctl restart myapp |
重启服务 |
systemctl status myapp |
查看服务状态(含 PID、内存、近期日志)✅ 最常用 |
journalctl -u myapp -f |
实时跟踪服务日志(替代 tail + nohup 方案)✅ 生产推荐 |
journalctl -u myapp --since "2026-01-01 10:00" |
查看指定时间段的服务日志 |
journalctl -u myapp -n 100 |
查看最近 100 条日志 |
systemctl enable myapp |
设置开机自启 ✅ 重要 |
systemctl disable myapp |
取消开机自启 |
systemctl list-units --type=service --state=running |
列出所有运行中的系统服务 |
💡 推荐:Spring Boot 应用注册为 Systemd 服务
# /etc/systemd/system/myapp.service
[Unit]
Description=My Spring Boot App
After=network.target
[Service]
Type=simple
User=deploy
WorkingDirectory=/opt/myapp
ExecStart=/usr/bin/java -jar /opt/myapp/app.jar --spring.profiles.active=prod
Restart=on-failure
RestartSec=10
[Install]
WantedBy=multi-user.target
之后 systemctl daemon-reload && systemctl enable --now myapp 即可一键托管。
🐳 Docker 基础(容器化部署)
| 命令 |
说明 |
docker ps |
查看运行中的容器 |
docker ps -a |
查看所有容器(含已停止) |
docker images |
查看本地镜像列表 |
| `docker exec -it <name |
id> bash` |
docker logs -f <name> |
实时跟踪容器日志 |
docker logs --tail 200 <name> |
查看最近 200 行日志 |
docker logs --since 10m <name> |
查看最近 10 分钟的日志 |
docker stop <name> / docker start <name> |
停止 / 启动容器 |
docker restart <name> |
重启容器 |
docker rm <name> / docker rmi <image> |
删除容器 / 删除镜像 |
docker build -t myapp:1.0 . |
从 Dockerfile 构建镜像 |
docker run -d -p 8080:8080 --name myapp myapp:1.0 |
后台运行容器(端口映射 + 命名) |
docker-compose up -d |
Compose 编译启动(后台运行) |
docker-compose down |
停止并删除容器和网络 |
docker system df |
查看 Docker 磁盘占用总览 ✅ 清理前必看 |
docker system prune -a |
清理无用镜像/容器/网络 ⚠️ 会删停止的容器和未用镜像 |
| `docker inspect <name |
id>` |
⏰ Crontab 定时任务
字段含义: * * * * *
分 时 日 月 周
| 表达式 |
含义 |
0 2 * * * |
每天凌晨 2 点执行(备份/清理常用) |
*/30 * * * * |
每 30 分钟执行一次 |
0 9-18 * * 1-5 |
工作日 9:00~18:00 每整点执行 |
0 0 * * 0 |
每周日午夜执行 |
# 编辑当前用户的 crontab
crontab -e
# 查看已配置的定时任务
crontab -l
# 示例:每天凌晨 2 点清理 30 天前的日志
0 2 * * * find /var/log/app -name "*.log" -mtime +30 -delete >> /var/log/cleanup.log 2>&1
# 示例:每小时重启一次健康检查失败的应用
0 * * * * if ! curl -sf http://localhost:8080/actuator/health > /dev/null; then systemctl restart myapp; fi
🔧 文本处理(偶尔用到但极省时间)
| 命令 |
说明 |
实战场景 |
sed -i 's/old/new/g' file |
全局替换文件文本 |
批量改配置(IP/端口/环境名) |
sed -i '/^#/d' file |
删除所有以 # 开头的行 |
清理注释行 |
awk '{print $1}' access.log |
提取第 1列 |
分析 IP / 提取 URL 路径 |
| `awk '{print $1}' access.log |
sort |
uniq -c |
| `sort file |
uniq` |
排序去重 |
echo $? |
上一条命令退出码 |
0=成功,非0=失败 ✅ 脚本判断基础 |
| `history |
grep git` |
搜索历史命令 |
ctrl+r |
反向搜索历史命令(交互式) |
快速召回长命令 |
clear / ctrl+l |
清屏 |
整洁强迫症福音 |
tee output.log |
同时输出到屏幕和文件 |
边看边存日志 |
xargs -I {} curl {} < urls.txt |
将输入转为命令参数 |
批量请求/批量操作 |
三、🔥 线上故障 5 分钟定位(实战案例链路)
🚨 场景一:生产报警 ------ 接口响应超时 / 报 500
排查原则:由外到内,由浅到深
① 确认报警真实性(收到告警 → 先验证是否误报)
↓ curl -s -o /dev/null -w "%{http_code} %{time_total}s\n" http://localhost:8080/actuator/health
② 快速看日志 --- 定位错误类型
↓ tail -F -n 100 /var/log/app/error.log | grep -i -E "ERROR|Exception|timeout"
③ 查系统资源 --- 判断瓶颈在哪层
↓ free -h → uptime → df -h → docker stats --no-stream
④ 定位进程状态
↓ ps aux | grep java | sort -k4 -rn | head -5
↓ jstack <PID> > jstack.txt
↓ jstack <PID> | grep -A 5 "RUNABLE" | head-50
⑤ 排查外部依赖
↓ ss -tlnp | grep 3306/6379 → telnet mysql-host 3306
⑥ 决策:恢复还是重启?
├ 能快速定位根因 → 修配置/扩容/清理磁盘/重启外部依赖 → 验证恢复
├ 无法快速定位但影响大 → 先重启恢复服务 systemctl restart myapp(保留现场事后分析)
└ 完全无法恢复 → 切流备用节点 / 回滚版本 / 发升级通告
重点关注错误信号:
| 日志关键词 |
可能原因 |
OutOfMemoryError |
堆内存溢出 → 见 OOM 排查链路 |
Connection refused |
目标服务挂了(MySQL/Redis/MQ) |
timeout / Read timed out |
网络慢 / 数据库慢查询 / 连接池耗尽 |
Too many open files |
文件句柄泄漏或 ulimit 不够 |
StackOverflowError |
无限递归调用 |
🔴 场景二:OOM(内存溢出)排查链路
症状:应用频繁 Full GC → 响应越来越慢 → 最终 java.lang.OutOfMemoryError: Java heap space
① 开启 Heap Dump(下次复现前配置好!)
JVM 参数加:-XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=/opt/dumps/
② 复现问题后分析 .hprof 文件
工具:Eclipse MAT / VisualVM → Leak Suspects 报告 → 大对象持有者
③ 常见 OOM 根因 Top 3
├ 1. 内存泄漏:静态集合/ThreadLocal/未关闭连接池不断累积对象
├ 2. 堆设太小:-Xmx 给的不够(生产一般 ≥ 2G)
└ 3. 数据量突增:一次查询返回过多数据 / 大报表导出
🟣 场景三:CPU 飙高 100% 排查链路
① 定位进程
top (按 P 排序) 或 htop → 找到 CPU 最高的 Java 进程 PID
② 定位线程
top -H -p <PID> → 找到 CPU 最高的线程 ID(十进制)
printf "%x" <TID> → 转十六进制
③ 导出栈并匹配
jstack <PID> > jstack.txt
grep <hex_tid> jstack.txt -A 10 → 找到罪魁祸首线程正在干嘛
④ 常见原因
死循环 / 死锁 / 正则回溯(ReDoS) / 无限递归
💡 排查核心原则 :先恢复服务,后分析根因。 业务连续性第一,现场数据保留好后先重启止血(systemctl restart myapp),事后慢慢分析 dump 和日志。
四、附录
Exit Code 速查
| 值 |
含义 |
0 |
成功 |
1 |
通用错误 |
2 |
命令用法错误(误用参数) |
126 |
命令无执行权限 |
127 |
命令找不到 |
128+N |
收到信号 N 导致终止(如 137 = 被 kill -9 杀掉) |
255 |
退出码超出标准范围 |
Spring Boot 生产部署 Checklist
① 环境隔离 profile 区分 dev/test/prod,.env 不入库
② JVM 参数 -Xms/-Xmx 一致避免动态扩缩,+UseG1GC,开启 HeapDumpOnOOM
③ 日志规范 统一 logback 配置,按天滚动 + 压缩 + 异步输出
④ 进程管理 注册为 systemd 服务,enable 开机自启
⑤ 健康检查 暴露 /actuator/health,对接监控系统 Prometheus/Grafana
⑥ 优雅停机 server.shutdown=graceful + spring.lifecycle.timeout-per-shutdown-phase=30s
⑦ 反向代理 Nginx 前置做 SSL 终结 + 负载均衡 + 静态资源缓存