要把这个问题说清楚,并不容易。
情况是这样的,项目现场高压柜跳闸,高压断电了,经过一天之后,蓄电池耗尽,二次侧的设备也没电停机了,其中包括过正反向隔离装置的网闸两台网闸通讯管理机。如下图黄色圈:
图中黄色圈中的是两台x86的工控机,操作系统为CentOS7.9 x86_64,预装的是minimal,无桌面环境。
这两个工控机:
1、外网机运行南瑞隔离装置发送软件;
2、内网机运行南瑞隔离装置接收软件。
今天早上我远程观察时,猛然发现两台机器的南瑞软件都没在正常运行。检查日志,正好是停电再上电之后,就不工作了。
手动启动程序,报异常:
意思是无法连接x11的桌面,java程序的界面不能显示。
首先我查看环境变量DISPLAY的值,确实是":10"。
由于项目现场这两台机器都没有显示器,所以操作系统没有安装桌面环境,但是为了配置,还是装了xvnc+xrdp,作为虚拟的桌面环境。我首先考虑到的是否是xvnc的连接问题,由于报错的时候提示是x11 window server的连接异常,我首先想到的是x11 window server没有安装,它的监听端口是6000开始,而xvnc的监听端口是5900开始,但是他们共享的是一个环境变量:DISPLAY。
而DISPLAY的写法是 DISPLAY=:1 或 DISPLAY=:2 或 DISPLAY=:99。
后面的数字,表示各自监听的端口偏移地址,比如查看到环境变量 DISPLAY=:2,那么如果是vnc,监听端口就是5902,如果是x11 window桌面,监听端口就是6002。
于是,我折腾了一天,尝试了各种测试,安装Xvfb,设置Xvfb的启动端口为 :11,并将这个值设置到环境变量中。启动测试,发现java程序启动正常不报错了,但是因为xrdp连接是xvnc,并不能看到java程序的窗口界面,所以不能修改参数,这个方法不可行,后来发现有个x11vnc的程序,这个看名字好像是x11和vnc之间的桥梁,也做了尝试,还是不能在rdp桌面中看到程序界面。
在这个时候,我再认真的观察这个原始的错误信息:
Invalid MIT-MAGIC-COOKIE-1 keyException in thread "main" java.awt.AWTError: Can't connect to X11 window server using ':10' as the value of the DISPLAY variable.
其实这个信息,我老弟已经提示过,说是不是x11 window证书的问题,但是我还是被x11 window和xvnc之间的区别屏蔽了认知,没有认证考虑这个事情。
我在网上搜索各种资料的过程中,发现x11 window也好,还是xvnc也好,要连接桌面的过程需要认证的,这个MIT-MAGIC-COOKIE-1就是认证令牌的key。
难道说这个key是错误的?
这个令牌的格式是:
主机名/unix:显示号 MIT-MAGIC-COOKIE-1(令牌名) 54f193be8cc5624074c3e528c6b2d602(令牌值)
难道说用户存储的令牌值变化了?
先切换到普通用户,然后运行下面的指令将该令牌值重新添加到用户的上下文中(起到关键作用的黄金指令):
>xauth list $DISPLAY
localhost.localdomain/unix:10 MIT-MAGIC-COOKIE-1 54f193be8cc5624074c3e528c6b2d602
>xauth add localhost.localdomain/unix:10 MIT-MAGIC-COOKIE-1 54f193be8cc5624074c3e528c6b2d602
然后重启java程序,铛铛铛!OK了
发送侧软件界面:
接收侧软件界面:
它们终于又开始工作了。