先说结论,这句话你记一下:**Rviz 窗口能不能活着,取决于它后面那条 X11 显示通道还在不在,而不是 Autoware 里那些算法节点有没有继续运行。**MobaXterm 表面上是个“SSH 终端工具”,但它实际上还干着一件容易被忽略的活——它给你提供了一个 Windows 端的 X server。你在 MobaXterm 里看到 Rviz 弹出来,本质上是远端的 Ubuntu/Autoware 机器把图形界面“投射”到了你本地 Windows 的 X 服务器上,中间靠 SSH 的 X11 转发隧道维持连接。一旦你关闭 MobaXterm,这条通道连同它背后的显示服务器一起没了,Rviz 作为一个 X11 客户端,只能报错退出。
这个坑我见过很多次,尤其是刚用 MobaXterm + 虚拟机跑 Autoware 的朋友:明明 roslaunch 没报错,后台看起来像还活着,可重连之后 Rviz 就是要死不活的。这篇文章就把这条链路拆开讲透,顺便把我自己后续用得最顺手的一套“算法进程和图形界面分离”的方案给出来。
1. 先还原现场:关闭 MobaXterm 后,到底是谁“杀了”Rviz
1.1 你看到的现象,可能不是一个现象
先问一个问题:你是哪种关闭方式?
我总结下来,大部分人说“MobaXterm 关闭后 Rviz 显示不了”,实际对应的是下面三种情况之一:
| 场景 | 你干了什么 | 你看到的 |
|---|---|---|
| A | 直接点整个 MobaXterm 主窗口的右上角 × | Rviz 窗口立刻消失,SSH 会话结束,roslaunch 终端也没了 |
| B | 只关掉了跑着 Autoware 的那个 SSH 标签页 | Rviz 窗口消失,但其他 MobaXterm 标签页还能用 |
| C | 先右键断开了 SSH 连接,再关闭 MobaXterm | Rviz 窗口原地消失,roslaunch 进程大概率也跟着退出 |
很多人以为 A 和 B 是一回事,其实不是。MobaXterm 里的 X server 是独立于“某个 SSH 标签”的,但 SSH 标签页里跑的 roslaunch、rviz、各种 ROS 节点,它们的生命周期又绑定在那个标签对应的 SSH 会话上。Rviz 窗口消失,本质上是远端进程收到“显示通道关闭”信号后自己退出,而不是什么 Autoware 核心崩溃。
1.2 把“显示通道断开”和“进程被杀”分开看
这里有个关键分层:
- Autoware 的算法节点,比如感知、规划、控制,它们跑在远端 Linux 机器上,本质上是无头进程,不需要屏幕。
- Rviz 不一样,它是一个 X11 GUI 客户端,必须连到一个 X server 上才能画出窗口。
- 你本地 Windows 的 MobaXterm,恰好就是那个 X server。
当连接断开,或 MobaXterm 退出,远程 Linux 机器上的 X client 会发现自己和 X server 之间的 socket 断了。X11 协议里,这可不像 TCP 一直重连那样简单。绝大多数 GUI 程序,包括 Rviz,收到 X server 断连后的反应就是直接退出,或者报“lost connection to X server”。
你可以在 MobaXterm 的日志里看到类似这样的东西:
code复制The connection to the X11 server was lost.
process has terminated
或者更直白一点,在启动 Rviz 的终端里看到:
code复制X connection to localhost:10.0 broken (explicit kill or server shutdown).
这句话里的 localhost:10.0,就是远端机器上的 DISPLAY 环境变量所指向的 X server。看清楚:它不是远端 Ubuntu 自己的显示器,而是你本地 Windows MobaXterm 提供的那一个。
1.3 为什么很多人误以为是“Autoware 跑挂了”
Autoware 这东西,一启动就是几十个节点。终端里刷日志刷得飞快,你很难一眼看出哪个节点还在。再加上 roscore / ROS 2 daemon 有时候导致“某些进程还活着”的假象,很多朋友就以为是 Autoware 卡死或者 Rviz 配置坏了。
我做了一个很简单的排查操作,建议你下次也这么试:
- 重新打开 MobaXterm,SSH 登录到那台 Autoware 机器。
- 执行
rosnode list。 - 如果发现很多算法节点还在,比如
localization,planning,twist_filter之类,说明 Autoware 核心没死。 - 再执行
rosrun rviz rviz(或重新启动对应 launch),如果能弹窗但原本那个 Rviz 没了,那问题就更清晰了:不是 Autoware 挂了,是 Rviz 原本所依赖的显示通道已经被你关了。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 为什么 Autoware 还活着,Rviz 却“接不回来”:DISPLAY、X server、SSH 三者互相锁死
2.1 DISPLAY 不只是环境变量,它是一条“图形的网线”
理解这一个点,基本就理解了这个问题的 80%。
在 Linux 的图形世界里,DISPLAY 环境变量告诉图形程序“你要把界面画到哪去”。它通常长这样:
:0:本机第一个 X serverlocalhost:10.0:通过 SSH 转发到远端 X server 的显示编号
当你在 MobaXterm 里选了 X11 forwarding,SSH 连接建立后,远端 shell 里会自动设置 DISPLAY。你在远端执行:
bash复制echo $DISPLAY
如果输出是:
bash复制localhost:10.0
那就说明:Rviz 启动后,会试图通过远端机器的 6010 端口,反向连回本地 Windows。这条连接不是凭空出现的,而是 SSH 隧道动态建立的。
这条隧道对应的本地端点,就是 MobaXterm 内置的 X server。
2.2 SSH 隧道和 X server 是同生共死的
很多人有个误区:以为 Rviz 只要能弹一次,之后就能一直弹。不是的。X11 转发是会话级的。
你每次 SSH 登录,远端就会动态分配一个 display 编号,可能是 10.0,下次也可能是 11.0。MobaXterm 会临时生成一份 Xauthority 授权,让远端 GUI 程序有权限连回本地。一旦 SSH 会话关闭,或者 MobaXterm 彻底退出,这个临时授权、隧道进程、X server 端点,全都清理掉。
这时候你会面对一个尴尬事实:Autoware 里那些不依赖图形界面的算法节点当然无所谓,它们继续在后台跑。可作为 X11 客户端的 Rviz,它找不到了当初连接的那个 X server,于是被迫退出。就算你立即重新打开 MobaXterm,重新 SSH 上去,看到原来的 roslaunch 进程可能还在终端之外残存,但屏幕上的 Rviz 已经永远没了。
2.3 那些“重连后明明启动正常但 Rviz 就是不出来”的情况
还有一部分人遇到的是“能 SSH 上去,启动 Autoware 也正常,但 Rviz 不出来”。这种通常不是同一类问题,但和本文的主线也有关系。
比较常见的有几个原因:
- MobaXterm 的设置里,X11 forwarding 没有被正确开启。
- 远端 Linux 没有安装
xauth,这是做 X11 授权转发的核心工具。 sshd_config里把X11Forwarding设成了no。- 你用了
sudo -i或者su切换用户,导致 DISPLAY 和 XAUTHORITY 被清掉。
如果 Rviz 完全没有弹出来,终端报错又是:
code复制cannot open display: localhost:10.0
那就先按这个顺序排查:
bash复制# 远端执行
echo $DISPLAY
which xauth
cat /etc/ssh/sshd_config | grep X11Forwarding
如果 DISPLAY 是空的,确认 MobaXterm 会话配置里勾选了 X11 forwarding。远端如果没装 xauth,SSH 会自动禁用 X11 转发,这时候需要装一下:
bash复制sudo apt install xauth
改完 sshd_config 记得重启 SSH 服务:
bash复制sudo systemctl restart sshd
然后再重新开一个 MobaXterm 会话,执行一个简单 GUI 程序验证:
bash复制xeyes
能看到一双眼睛就说明显示链路是通的。
3. 最小化、关标签页、断开连接:三种操作对 Autoware 和 Rviz 的影响完全不同
3.1 直接点最小化,不等于保留 X server
很多资深用户会用“最小化到系统托盘”来让 Rviz 继续显示。这招在很多情况下确实有用,因为它保住了 MobaXterm 进程,也就保住了 X server。
但注意,这不是让你去点“最小化”按钮就完事。MobaXterm 有几种退出行为:
| 操作 | SSH 会话 | X server | Rviz |
|---|---|---|---|
| 最小化到任务栏 | 保持 | 保持 | 正常显示 |
| 最小化到系统托盘并关闭主窗口 | 部分版本仍保持后台 | 保持 | 可能正常 |
| 直接断开 SSH 标签 | 结束 | 可能还在(取决于主进程) | 窗口消失 |
| 完全退出 MobaXterm | 全部结束 | 退出 | 窗口消失 |
这里的原因也不难理解:MobaXterm 的 X server 是宿主进程的一部分,除非你设置了常驻。所以如果你的目标是“只离开一会儿,Rviz 别死”,最稳妥的做法其实是:别关标签,也别断连接,直接让 MobaXterm 最小化。等回来了窗口还原,一切还在。
听起来像废话,但这确实是很多人忽略的“最简单方案”。很多新手误以为终端窗口不关就占着资源,非要去点一下断开按钮,结果把自己的图形界面搞没了。
3.2 关标签页:SSH 会话退出,不是 X server 退出
只关当前 SSH 标签页的情况要复杂一些。
MobaXterm 的标签页是独立的 SSH 会话。当你关闭标签页,远端对应的 sshd 会话结束。sshd 会向会话内的进程发送 SIGHUP 信号,默认情况下会终止该会话的 shell 以及 shell 的子进程。所以 roslaunch 如果是直接在这个标签里启动的,通常也会跟着退出,不只是 Rviz 消失。
如果你恰好是用 nohup 或 tmux 把 Autoware 拉起来的话,算法节点可能还在。但 Rviz 不行,因为当时 Rviz 是通过这个标签页里的 DISPLAY 连到本地 X server 的,SSH 连接一断,X11 隧道就没了。Rviz 作为图形客户端,必然退出。
3.3 为什么有时候你看到“rosnode 还在”?
这里再补充一个细节。很多时候你把 Autoware 的 roslaunch 放在后台或者 nohup 里跑,关闭 SSH 标签页后重新登录,执行 rosnode list 发现一堆节点还在。这时候你就容易误判:以为 Autoware 整个系统都好好的,只是 Rviz 出问题了。
实际上,ROS 节点本身的存活,和 GUI 显示链路是两套生命周期。ROS master / daemon 是独立的,Autoware 节点只要没有收到 SIGHUP,并且 ROS 网络正常,它当然可以继续跑。可 Rviz 无法脱离 X server 存活。
所以我的经验是:当你决定要在后台跑 Autoware 时,就应该把“算法后台”和“图形查看器”当成两个东西来管理。这直接引出下一节。
4. 根治思路:把 Autoware 的算法进程和 Rviz 查看器彻底拆开
4.1 用 tmux 保活整套 Autoware
如果你是想长时间跑 Autoware,同时又不希望因为 MobaXterm 一关就前功尽弃,那我强烈建议你改用 tmux。
tmux 的作用是:即使在 SSH 断线之后,远端依然存在一个持久的终端会话。它不依赖你本地的 MobaXterm,也不依赖 X11 隧道。你的 roslaunch 可以留在 tmux 会话里继续运行。
具体做法:
bash复制# SSH 登录远端 Ubuntu
ssh user@autoware-host
# 开启一个新的 tmux 会话,名字叫 aw
tmux new -s aw
# 在 tmux 里 source Autoware 环境
source /opt/ros/noetic/setup.bash
source ~/autoware/install/setup.bash
# 启动 Autoware(以 planning simulator 为例)
roslaunch autoware_launch planning_simulator.launch
这时候按 Ctrl + b,然后松开,再按 d,就能脱离 tmux 会话,回到普通 shell。此时 ssh 退出、MobaXterm 关闭、电脑重启(只要远端 Ubuntu 没重启),Autoware 进程都还在 tmux 里跑。
下次重新连接时:
bash复制tmux attach -t aw
就能重新看到 Autoware 的日志界面。
4.2 别让 Rviz 跟着 roslaunch 自动拉起
很多 Autoware launch 文件里默认会带 rviz 作为启动子进程。比如 .launch 文件里常见这样的结构:
xml复制<arg name="rviz" default="true" />
<node name="rviz" pkg="rviz" type="rviz" args="-d $(find autoware_launch)/config/xxx.rviz" if="$(arg rviz)" />
这意味着只要你执行 roslaunch,Rviz 就会试图启动。如果此时 DISPLAY 不通,或者 MobaXterm 没开 X server,轻则日志刷错,重则整个 launch 因为 GUI 节点 failure 而起不来。
我的建议是:分两层跑。
第一层:不带 Rviz 启动 Autoware,让算法跑在 tmux 里。
bash复制roslaunch autoware_launch planning_simulator.launch rviz:=false
如果某份 launch 文件不支持 rviz:=false,你就自己 grep 一下:
bash复制grep -n "rviz" ~/autoware/src/launcher/autoware_launch/launch/planning_simulator.launch
看到结构之后再决定改 default="true" 还是改命令行参数。不要怕改 launch,这是 Autoware 使用者的基本操作。
第二层:需要看界面时,单独开一个终端窗口,手动把 Rviz 拉起来:
bash复制source /opt/ros/noetic/setup.bash
source ~/autoware/install/setup.bash
rosrun rviz rviz -d ~/autoware/src/launcher/autoware_launch/config/planning_simulator.rviz
这样 Autoware 算法归 Autoware 算法,Rviz 归 Rviz。临时关闭 MobaXterm 只会导致手动打开的 Rviz 窗口退出,不会影响 tmux 里跑着的 Autoware 核心。
4.3 如果必须无人值守运行,可以配合虚拟显示
还有一种场景,是你希望 Autoware 完整跑起来,包括 rviz 节点,同时也希望它不依赖你本地 MobaXterm。这时候可以使用 Linux 端的虚拟显示,比如 Xvfb。
bash复制sudo apt install xvfb
xvfb-run -a roslaunch autoware_launch planning_simulator.launch
这样 Rviz 会连到一个虚拟的 X server 上,相当于在远端 Linux 机器上开了一个看不见的“屏幕”。此时你关闭 MobaXterm,Autoware 和 Rviz 都不会受影响。只不过你自己也看不到那个 Rviz 画面了。如果你只是想让 Autoware 完整跑通测试、留 log,这种模式很合适。如果你还想着事后能截屏或者重新展示画面,可以考虑配合 x11vnc 或者定期截图,但这属于额外的话题,这里先不展开。
4.4 手动拉起 Rviz 时,为什么“看不到刚才的地图”
还有一个小坑。当你用 tmux 把 Autoware 算法节点保活后,重新连接并「手动」打开 Rviz,很多时候地图和路径显示不出来,或者显示得和原来不一样。
原因很简单:Autoware 的 UI 配置里,有一部分话题是基于启动时参数动态变化的,Rviz 如果手动打开,可能默认没有订阅到正确的话题。
解决方式是:不要随便 rosrun rviz rviz 开空白界面,而是找到 Autoware 自带的 Rviz 配置文件,比如 planning_simulator.rviz,把它传进去。同时确认你打开的 Rviz 中 Fixed Frame 设置正确,比如 map。这个话题在 Autoware 里也常见,先记住这一点,能少走很多弯路。
5. 常见“关门后”报错和现象对照表:别把问题误判成环境坏了
5.1 直接对表自查
我在不同机器上踩过不少次这类坑,把常见表现和判断方式整理成了一张表,你可以直接拿去对照:
| 现象 | 根因方向 | 下一步操作 |
|---|---|---|
| 关闭 MobaXterm 后,Rviz 窗口立刻消失 | X server 随 MobaXterm 退出 | 最小化而非关闭,或改用 tmux 头less 方案 |
重连后 rosnode list 还有节点,但 Rviz 不再弹出 |
GUI 显示链路已断,算法节点未死 | 单独手动启动 rviz,不需要重启 Autoware |
新开 MobaXterm 执行 rosrun rviz 报 cannot open display |
DISPLAY 未正确设置,或 X11 forwarding 没打开 | 检查会话设置里的 X11 forwarding |
rviz 窗口闪一下立刻退出,终端提示 X connection broken |
MobaXterm 进程已退出或被系统断开 | 让 MobaXterm 保持后台,或改用远端虚拟显示 |
通过 sudo 运行 Autoware 时,Rviz 不显示 |
sudo 环境丢失 DISPLAY 和 XAUTHORITY | 用 sudo -E 或正常用户启动 GUI |
| 关闭标签页后,Autoware 也停了 | roslaunch 作为 SSH 会话子进程收到 SIGHUP | 改用 tmux/nohup 启动 Autoware |
提示 No protocol specified 或 X 授权失败 |
X authority 不匹配 | 断开会话重新登录,确保没有多个 X server 抢授权 |
这张表不是让你照着挨个试,而是提醒你:先判断是“进程死了”还是“只有画面死了”,方向错了,后面全白费。
5.2 检查步骤建议按这个顺序来
我自己的排障顺序很简单,从“网络链路”到“X server 链路”再到“ROS 进程状态”:
bash复制# 1. 确认能登录
ssh user@host
# 2. 确认远端能否反向连回本地 X server
echo $DISPLAY
xeyes
# 3. 确认 ROS 节点还在不在(算法层)
rosnode list
# 4. 确认 GUI 层能不能单独启动
rosrun rviz rviz
如果第 4 步能启动,说明问题不是环境坏了,而在于“关闭 MobaXterm 的时机和方式”不对。如果第 2 步就失败,说明新会话的 X11 通道本身有问题,得先把 MobaXterm 的 X11 转发配好。
5.3 遇到“连接不上虚拟机”或者“rviz 一启动就卡死”的潜在元凶
很多搜索热词里都有“MobaXterm 连接不上虚拟机”“Rviz 仿真卡住”。这里顺带提一个和本文主题强相关的原因:**如果你同时开了多个 MobaXterm 窗口,或者之前异常退出过 MobaXterm,Windows 端可能残留了僵死的 X server 进程。**新的 MobaXterm 启动后,占用的显示编号或端口可能和远端期望的不一致,导致连得上 SSH,但 Rviz 起不来。
遇到这种情况,最简单的处理是:
- 彻底退出所有 MobaXterm。
- 在 Windows 任务管理器里结束所有和 MobaXterm 相关的进程。
- 重新打开 MobaXterm。
- 重新 SSH 登录,再启动 Rviz。
别看这个操作简单,它能解决相当一部分“刚才还能出图,重开就黑屏”的诡异问题。
6. 后续实操里我最推荐的一套习惯
6.1 典型工作流:三个窗口,各司其职
我后来在自己的环境里稳定下来的工作流是这样的:
- MobaXterm 标签 A:SSH 登录后,
tmux attach -t aw,专门看 Autoware 运行日志。 - MobaXterm 标签 B:SSH 登录后,用
tail -f跟踪某个具体模块的 log,比如~/autoware/log/里保存的日志。 - MobaXterm 标签 C:SSH 登录后,手动启动 Rviz。
标签 A 和 B 即使关闭,tmux 里的 Autoware 也不受影响。标签 C 一旦关闭,Rviz 就没了,但这没关系。需要看图时再开一个标签 C,很快就能拉起来。
这里我给你一个建议:Autoware 的正式运行,永远放在 tmux 里。 不要让 Autoware 直接依赖 MobaXterm 的某个 SSH 标签,否则随意一关,整个系统就跟着遭殃。你也许觉得这有点“过度设计”,但当你真的跑过一晚上长时间测试,只因为手滑关错标签,就得重新等整个 Autoware 初始化时,就明白这个习惯多重要了。
6.2 关于日志:“关掉窗口日志就丢了”的问题
热词里还有人说“MobaXterm 保存日志”“log 设置”之类的问题。如果你的 Autoware 不是在重定向日志,或者你启动 Autoware 的终端随 MobaXterm 关闭,那日志自然就断了。
用 tmux 跑 Autoware 还有一个额外好处:日志不会随窗口关闭而丢失。但你最好还是把 roslaunch 的输出重定向到文件,尤其是长时间运行。
bash复制tmux new -s aw
roslaunch autoware_launch planning_simulator.launch rviz:=false 2>&1 | tee ~/autoware/run_$(date +%Y%m%d_%H%M%S).log
这样就算你关机了,日志也在文件里,不会像终端会话那样无影无踪。
6.3 真的非关不可时,按这个顺序退出
如果你确实要离开,而且短期内不会回来:
- 先把 Rviz 手动关掉。别让它一直挂在已经失效的显示通道上。
- 确认 tmux 里的 Autoware 进程还在,
tmux ls能看到会话。 - 断开 MobaXterm 的 SSH 标签。
- 再退出 MobaXterm。
这套顺序能保证 Autoware 核心不挂,日志不丢,下次回来一条命令就能重新连上看状态。
6.4 最后分享一个我在实际项目里踩出来的经验
早期我用 Autoware 时,也天真地以为“MobaXterm 只是一个远程终端,关了就关了,反正运行是在远端机器上”。直到有一次在停车场测试前,我随手把 MobaXterm 关了,结果 Autoware 的整个 roslaunch 进程树全没,现场花了几分钟重新初始化,别提多狼狈。
后来我养成了一个小习惯:只要远程机器上跑着 Autoware,本地 MobaXterm 就不点右上角的 ×,哪怕只是最小化到任务栏。 凡是需要长时间挂机、无人值守的,一律 tmux。凡是临时想看可视化状态的,手动开 Rviz。这两条规则分开记,几乎不会出问题。
Rviz 这个工具本身不复杂,但它牵扯到 SSH、X11 转发、DISPLAY 环境变量、进程生命周期,任何一个环节断掉,都会导致“明明 Autoware 没死,但界面就是没了”。希望这篇能帮你把链路理清楚,下次再遇到,至少你能一眼判断出,问题出在“进程”还是“画面”。
