设置 RPi 来运行 Java 程序

设置 RPi 来运行 Java 程序

我正在尝试在 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

如果当您需要访问该服务器时,您可以使用x11vncvnc 查看器。这有点超出了您的问题范围,但这里适用于使用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,但速度太慢了 ^^'

相关内容