我正在尝试在 Ubuntu MATE 20.04 上运行一个需要图形输出才能运行的程序。有时我会连接显示器,有时则不会。我想配置我的计算机(树莓派 4),以便无论有或没有显示器,它都能启动到 MATE。
作为背景,这个程序是一个用java编写的无线电扫描仪软件,我希望能够在启动时启动该程序。它需要图形输出才能运行。该程序不是我编写的,尝试在 X 之外启动它超出了我的能力范围。
目前,我将其设置为在 MATE 桌面内作为启动程序启动,并且在有显示器时工作正常。
我不在乎在没有显示器的情况下桌面是否正在运行,系统资源对我来说不如让程序运行重要。
在“假”X 会话上运行程序也是可以接受的,但是我需要防止在连接显示器时发生这种情况。这也可以通过在桌面启动后手动(但最好是自动)终止进程来解决。再说一遍,这对我来说并不重要,重要的是让它首先发挥作用。
编辑:练习的目的是让程序运行,如果我插入树莓派并让它直接启动到程序扫描无线电(警察等)并通过扬声器播放它。
编辑2:
zach@zach-MATE20:~$ sudo systemctl enable rc-local.service
[sudo] password for zach:
The unit files have no installation config (WantedBy=, RequiredBy=, Also=,
Alias= settings in the [Install] section, and DefaultInstance= for template
units). This means they are not meant to be enabled using systemctl.
Possible reasons for having this kind of units are:
• A unit may be statically enabled by being symlinked from another unit's
.wants/ or .requires/ directory.
• A unit's purpose may be to act as a helper for some other unit which has
a requirement dependency on it.
• A unit may be started when needed via activation (socket, path, timer,
D-Bus, udev, scripted systemctl call, ...).
• In case of template units, the unit is meant to be enabled with some
instance name specified.
答案1
我建议您让 Java 程序始终运行在一个非常轻量的虚拟桌面环境上,可以通过 VNC 从 Raspberry Pi (RPi) 本身或通过网络从另一台计算机进行访问。这样,RPi 中是否插入显示器就无关紧要了。
设置 RPi 来运行 Java 程序
我们将使用 Xvfb 和 Fluxbox 为我们提供虚拟桌面,并使用“x11vnc”提供对虚拟桌面的访问。来自 Xvfb 的 Debian 软件包描述:
Xvfb 提供了一个 X 服务器,可以在没有显示硬件和物理输入设备的机器上运行。它使用虚拟内存模拟哑帧缓冲区。
安装必要的包
sudo apt install x11vnc xvfb fluxbox x11-apps
我假设 RPi 的默认用户 ( pi
) 将用于运行 Java 程序。
运行Java程序的脚本
通过 SSH 或其物理控制台(带有真实的显示器和键盘)登录 RPi。
/home/pi/radio_scanner.sh
创建包含以下内容的脚本文件:
#!/bin/bash
export DISPLAY=:1
Xvfb $DISPLAY -screen 0 1024x768x16 &
fluxbox &
x11vnc -display $DISPLAY -bg -forever -nopw -quiet -xkb
xclock & # just for testing, may remove this line
java -jar some_file.jar & # you program
使脚本可执行:
chmod +x /home/pi/radio_scanner.sh
作为后台进程运行脚本,将其输出重定向到文件:
~pi/radio_scanner.sh > ~pi/log_radio_scanner.txt 2> ~pi/errors_radio_scanner.txt &
可选的最低安全性(密码保护)
如果您想使用密码保护VNC访问,请先设置密码:
x11vnc -storepasswd
然后,在脚本上,将正在执行的行替换x11vnc
为
x11vnc -display $DISPLAY -bg -forever -usepw -quiet -xkb
查看Java程序运行情况
从 RPi 控制台或通过网络访问的另一台计算机,使用 VNC 客户端连接到 RPi,我的是tigervnc-viewer
(Linux)。
vncviewer RPI_IP_ADDRESS
您现在应该看到 Fluxbox 桌面,其中运行着 Java 程序和 xclock 应用程序。
自动启动 Java 程序
为了使 Java 程序在 RPi 启动时始终运行,请尝试以下两个选项之一。
1)使用定时任务
可能是 Ubuntu Mate 的最佳选择。
编辑您的用户 (pi) 的 crontab 并安排程序在启动期间运行。在 shell 中执行:
crontab -e
将出现一个文本编辑器,在末尾添加以下行
@reboot /home/pi/radio_scanner.sh
2)使用rc.local
将以下行插入到文件中/etc/rc.local
。请小心将“”命令保留exit 0
为该文件的最后一行!
su - pi --command=/home/pi/radio_scanner.sh > ~pi/log_radio_scanner.txt 2> ~pi/errors_radio_scanner.txt &
答案2
您可以使用xvfb-run
:
xvfb-run 是 Xvfb(1x) 命令的包装器,它简化了在虚拟 X 服务器环境中运行命令(通常是 X 客户端或包含要运行的客户端列表的脚本)的任务。
如果您的程序/脚本是/usr/local/bin/radio-scanner
您可以直接运行它:
xvfb-run /usr/local/bin/radio-scanner
如果当您需要访问该服务器时,您可以使用x11vnc
vnc 查看器。这有点超出了您的问题范围,但这里适用于使用x11vnc+xvncviewer
.让我们使用xclock
例如:
# run insided X server number 99, specify the auth file
xvfb-run -n 99 -f /tmp/xvfb-auth -- xclock -digital -update 1
然后,当您需要查看当前屏幕时:
# connect x11vnc to it
x11vnc -display :99 -N -auth /tmp/xvfb-auth
# connect a vnc client to display :99
xvncviewer :99
答案3
我遇到了同样的情况,我很快就解决了,安装了 x2go 服务器和 x2go 客户端。
https://wiki.x2go.org/doku.php
https://wiki.x2go.org/doku.php/wiki:repositories:raspbian
https://www.youtube.com/watch?v=Qzjg8MvdkmA&ab_channel=LawrenceSystems
我尝试了其他解决方案,例如 vnc,但速度太慢了 ^^'