首页/系统/Linux 运维命令速查/场景:用软链切换发布版本(current)
文件与目录76 条

场景:用软链切换发布版本(current)

版本目录并存 + current 软链指向线上版本:发布即切换,回滚即改指向,是零停机发布的经典模式。

Linux 运维命令速查系统更新于 2026-10-13

这个场景解决什么

版本目录并存、用一条软链指向线上版本,是最省事也最通用的发布模式:/opt/app/v20261012 这样的版本目录各自独立,/opt/app/current 指向当前生效的那一个。发布等于切链,回滚等于把链指回去。它的前提有两条:服务的配置读的是 current 这个路径,而不是写死的版本号;新旧版本的目录都完整保留着。

基本信息

场景以软链切换发布版本,秒级上线与回滚
工具组合ln 建链、readlink 验证指向、mv -T 做原子替换
核心前提先准备好新版本目录并完成自检,再切链
风险等级中:切链本身很快,但应用是否跟随软链需要提前确认

典型使用场景

  • 常规发布:新版本解压到独立目录,自检通过后切链生效
  • 快速回滚:把 current 指回上一个版本目录,无需重新部署
  • 灰度验证:先用一个探测用的软链指向新版本,验证后再切主链
  • 多环境共用产物:测试与生产使用同一份构建产物,只是指向不同版本目录
  • 发布留痕:目录名带日期或提交号,历史版本一目了然,便于审计

切链与验证

切链与验证
ls -1 /opt/app                         # v20261011 v20261012 ...
ln -sfn /opt/app/v20261012 /opt/app/current    # 直接改指向(非原子)
readlink -f /opt/app/current                   # 验证最终指向
ls -l /opt/app/current                         # 看链接本身与目标
systemctl reload myapp                         # 让应用重新解析路径(视应用行为而定)

更稳的原子替换

更稳的原子替换
ln -s /opt/app/v20261012 /opt/app/current.new
mv -T /opt/app/current.new /opt/app/current    # rename 语义,原子生效
readlink /opt/app/current
# 回滚:把链指回上一个版本
ln -sfn /opt/app/v20261011 /opt/app/current && readlink -f /opt/app/current

切换方式对比

方式是否原子适用
ln -sfn 目标 链接否:先删后建,存在极短空窗普通场景够用,读端能容忍瞬时失效
ln -s 新链 && mv -T 新链 链接是:rename 系统调用原子替换高并发读端,或对发布抖动敏感的服务
直接改配置文件里的版本路径不适用不推荐:每次发布都要动配置且难回滚
切链之后应用是否立刻使用新版本,取决于它什么时候解析路径:只读一次配置的进程需要 reload 或重启;每次访问都重新解析的脚本型应用会自动跟上。发布前先确认这一点,避免出现「切了链但没生效」的误判。
回滚的前提是旧版本目录还在、且旧版本的依赖与配置仍然兼容。清理历史版本时至少保留最近两到三个,否则回滚会变成重新部署。

易错点

  • ln -sfn 不是原子操作:它先删除旧链接再创建新链接,高并发读端可能抓到一瞬间的空窗,敏感场景用 mv -T 替换
  • 以为改了链接就生效:部分服务在启动时已把路径解析成真实目录,必须 reload 或重启才跟随新版本
  • 把 current 当成真实目录往里写日志或数据:切链后写入会落到新版本目录,数据与代码混在一起,日志应放在独立路径
  • 清理旧版本目录时删得太狠:回滚依赖旧版本存在,至少保留上一版与当前版

数据来源与参考

  • man 1 ln(GNU coreutils 手册)
  • man 1 mv(GNU coreutils 手册)

相关工具

​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌